我很雾刺的一件事!!!
DP他就是运行错误!(我也不知道为什么)
本来想看一看别人的题解用的DP都是怎么写的,但是:竟然没人写DP!
来吧看一下大师是怎么RE的:
#include<iostream> #define ll long long using namespace std; int f[10007][10007]; int W,V,p,v,w; int main(){ cin>>V>>W; int s=5; while(s--){ cin>>p>>v>>w; for(int i=V;i>=v;i--) for(int j=W;j>=w;j--) f[i][j]=max(f[i][j],f[i-v][j-w]+p); } cout<<f[V][W]; return 0; }
如果有哪位大好人看出我哪里出问题了评论区告诉我一下谢谢
那好吧沉睡的野兽,苏醒了,题你不敬我,我就打暴力:
思路很简单!
直接套上五个for跑就行了,复杂度是O(2^5)很快:
#define FOR(a) for(int a=0;a<=1;a++) FOR(a) FOR(b) FOR(c) FOR(d) FOR(e)
具体地,每次我们只要当空间和重量都满足条件的前提下,更新一下价值的最大值就可以了:
if(vi<=V&&wi<=W)pi>M?M=pi:1;
那么最后晒完整高清无码代码
#include<iostream> #define FOR(a) for(int a=0;a<=1;a++) using namespace std; int V,W,p[6],v[6],w[6]; int M=-1000000007; int main(){ cin>>V>>W; for(int i=1;i<=5;i++)cin>>p[i]>>v[i]>>w[i]; FOR(a) FOR(b) FOR(c) FOR(d) FOR(e){ int vi=0,wi=0,pi=0; if(a)vi+=v[1],wi+=w[1],pi+=p[1]; if(b)vi+=v[2],wi+=w[2],pi+=p[2]; if(c)vi+=v[3],wi+=w[3],pi+=p[3]; if(d)vi+=v[4],wi+=w[4],pi+=p[4]; if(e)vi+=v[5],wi+=w[5],pi+=p[5]; if(vi<=V&&wi<=W)pi>M?M=pi:1; } cout<<M; return 0; }
你能说它暴力么!要时间,2^5这多快啊!要空间,又用不上DP的f[10007][10007],真的是:WULAWULA!
0.0分
1 人评分
C语言程序设计教程(第三版)课后习题6.9 (C语言代码)浏览:806 |
C语言训练-计算t=1+1/2+1/3+...+1/n (C语言代码)浏览:942 |
WU-判定字符位置 (C++代码)浏览:1471 |
2004年秋浙江省计算机等级考试二级C 编程题(1) (C语言代码)浏览:539 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:624 |
核桃的数量 (C语言代码)浏览:726 |
printf基础练习2 (C语言代码)浏览:547 |
C语言程序设计教程(第三版)课后习题8.7 (C语言代码)浏览:538 |
拆分位数 (C语言代码)浏览:464 |
C语言训练-斐波纳契数列 (C语言代码)浏览:540 |