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   }

 

 

你可能感兴趣的:(dp)