http://acm.hdu.edu.cn/showproblem.php?pid=3496
这题是一道二维费用背包问题,刚开始的时候我把所有的都初始化为-1,只有ans[0][0]=0;
结果就是一直在WA,我没想明白是怎么回事,我认为要满足只有恰好用完的话,那只要将所有的都设置为-1就可以了。
后来看了别人的题解,我是略2,想的是没错。如果要恰好用完的话,是要将别的都初始化为-1。但是这个恰好是指的物品的件数恰好,
那么就是说二维的费用中有一个费用是恰好,所以初始化-1的时候只要是对有这个要求的这一维进行初始化就可以了。
想到了先前做树状数组也是,总是有点生搬硬套o(╯□╰)o。。。
看到别人的代码说,循环的位置有特定的,我觉得是没特定的,只要知道自己的二维分别代表的是什么,然后将自己的二维初始化好就可以了。
View Code
1 #include <iostream> 2 #include <string.h> 3 using namespace std; 4 const int maxn = 105; 5 int ans[maxn*10][maxn],v[maxn],w[maxn],cv[maxn]; 6 int main() 7 { 8 long i,j,n,m,l,k,t,sum; 9 cin>>t; 10 while(t--) 11 { 12 cin>>n>>m>>k; 13 for(i=0;i<n;i++) 14 { 15 cin>>v[i]>>w[i]; 16 } 17 memset(ans,-1,sizeof(ans)); 18 for(j=0;j<maxn*10;j++) 19 ans[j][0]=0; 20 for(i=0;i<n;i++) 21 { 22 for(j=k;j>=v[i];j--) 23 for(l=m;l>0;l--) 24 if(ans[j-v[i]][l-1]!=-1 && ans[j-v[i]][l-1]+w[i]>ans[j][l]) 25 ans[j][l]=ans[j-v[i]][l-1]+w[i]; 26 } 27 if(ans[k][m]!=-1) cout<<ans[k][m]<<endl; 28 else cout<<"0"<<endl; 29 } 30 return 0; 31 }
做到这里回去重新看下HDU 2660.