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 }