NYOJ 311 完全背包 (dp)

地址:http://acm.nyist.net/JudgeOnline/problem.php?pid=311

思路:dp问题,同NYOJ 289 苹果问题,在此基础上改动即可AC,至于除dp[0]为0外全部初始化为负无穷,不太明白为啥要初始化负无穷。。。在思考。。。

代码如下:

 1 #include <stdio.h>
 2 #include <string.h>
 3 #define  N 100001
 4 int dp[50001];
 5 int c[N],w[N];
 6 int max(int x,int y)
 7 {
 8       return x>y?x:y;
 9 }
10 int main()
11 {
12       int m,v,i,j,test;
13       scanf("%d",&test);
14       while(test--)
15       {
16             scanf("%d%d",&m,&v); 
17             if(m==0&&v==0)  break;
18             for(i=0;i<m;i++)        
19             scanf("%d%d",&c[i],&w[i]);
20             memset(dp,-1000000,sizeof(dp));//除dp[0]为0外全部初始化为负无穷,不太明白为啥要初始化负无穷。。。 
21             dp[0]=0;
22             for(i=0;i<m;i++)
23             {
24                 for(j=c[i];j<=v;j++)
25                 {
26                     if(dp[j]<dp[j-c[i]]+w[i])
27                     dp[j]=dp[j-c[i]]+w[i];
28                 }
29             }
30             if(dp[v]>0)
31               printf("%d\n",dp[v]);
32             else
33               printf("NO\n");
34       }
35       return 0;
36   }

 

 

posted on 2012-08-17 21:29  mycapple  阅读(285)  评论(0编辑  收藏  举报

导航