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; }