dp之多维背包hdu4501
思路:将v1,v2,k都当作一种体积,每种物品只能取一次,求max.......
反思:以前写背包,由于只有一个体积,所以习惯性的在for中,就所取的最小值限制,而在这次,因为这里导致wa了,具体是因为在多个体积限制的背包里,当这个体积小于它的最小体积时,它可以不去减它的最小体积,而是作为一种状态来传递其他体积的限制的值........
wa代码:
#include<iostream> #include<stdio.h> #include<string.h> using namespace std; int dp[105][105][110],s[105][3]; int max(int x,int y) { if(x>y) return x; else return y; } int main() { int n,v1,v2,k; while(scanf("%d%d%d%d",&n,&v1,&v2,&k)>0) { for(int i=1;i<=n;i++) scanf("%d%d%d",&s[i][0],&s[i][1],&s[i][2]); memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++) { for(int j=v1;j>=s[i][0];j--) { for(int p=v2;p>=s[i][1];p--) { for(int q=k;q>=0;q--) { int maxx=0; if(maxx<dp[j-s[i][0]][p][q]+s[i][2]) maxx=dp[j-s[i][0]][p][q]+s[i][2]; if(maxx<dp[j][p-s[i][1]][q]+s[i][2]) maxx=dp[j][p-s[i][1]][q]+s[i][2]; if(q>0&&maxx<dp[j][p][q-1]+s[i][2]) maxx=dp[j][p][q-1]+s[i][2]; if(maxx<dp[j][p][q]) maxx=dp[j][p][q]; dp[j][p][q]=maxx; } } } } printf("%d\n",dp[v1][v2][k]); } return 0; }
ac代码:
#include<iostream> #include<stdio.h> #include<string.h> using namespace std; int dp[105][105][110],s[105][3]; int max(int x,int y) { if(x>y) return x; else return y; } int main() { int n,v1,v2,k; while(scanf("%d%d%d%d",&n,&v1,&v2,&k)>0) { for(int i=1;i<=n;i++) scanf("%d%d%d",&s[i][0],&s[i][1],&s[i][2]); memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++) { for(int j=v1;j>=0;j--) { for(int p=v2;p>=0;p--) { for(int q=k;q>=0;q--) { int maxx=0; if(j>=s[i][0]&&maxx<dp[j-s[i][0]][p][q]+s[i][2]) maxx=dp[j-s[i][0]][p][q]+s[i][2]; if(p>=s[i][1]&&maxx<dp[j][p-s[i][1]][q]+s[i][2]) maxx=dp[j][p-s[i][1]][q]+s[i][2]; if(q>0&&maxx<dp[j][p][q-1]+s[i][2]) maxx=dp[j][p][q-1]+s[i][2]; if(maxx<dp[j][p][q]) maxx=dp[j][p][q]; dp[j][p][q]=maxx; } } } } printf("%d\n",dp[v1][v2][k]); } return 0; }
朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。