NYOJ_289_苹果

首先,我们考虑对于某个V容量,它能装下的苹果为1,2,3,但是装入的顺序无关紧要。

然后我们模拟一下:

对于某个苹果,能装下它的v更新dp数组

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
using namespace std;
struct apple
{
    int c,w;
}a[1005];
int dp[1005];
int main()
{
 int v,n,i,j;
 while(~scanf("%d%d",&n,&v))
 {
     if(v==0&&n==0) break;
     memset(dp,0,(v+1)*4); //4代表4个字节
     for(i=0;i<n;++i)
    {     scanf("%d%d",&a[i].c,&a[i].w);
         for(j=v;j>=a[i].c;--j)//一个容量一个容量的DP
         {
             dp[j]=max(dp[j],dp[j-a[i].c]+a[i].w);//其实用if更省时,if(dp[j]<dp[j-a[i].c]+a[i].w)
         }
     }
         printf("%d\n",dp[v]);
 }
 return 0;
}

 

posted @ 2013-04-30 13:41  小仪在努力~  阅读(219)  评论(0编辑  收藏  举报