HDU 3496 Watch The Movie

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.

posted @ 2012-09-23 10:32  YORU  阅读(350)  评论(0编辑  收藏  举报