poj 3624
完完全全就是一个01背包问题!!!
具体01背包网上到处讲解,不再赘述。
由于01背包在计算过程中只需要用到两行,当前计算行和上一行,所以dp数组可以这么开:dp[2][maxn]。还有就是用cin〉〉会超时。
#include<cstdio>
#include<cstring>
int a[13000],N,M,w[3500],d[3500],dp[2][13000];
int max(int a,int b)
{
return a>=b?a:b;
}
int main()
{
int i,j;
memset(a,0,sizeof(a));
memset(w,0,sizeof(w));
memset(d,0,sizeof(d));
memset(dp,0,sizeof(dp));
scanf("%d%d",&N,&M);
for(i=0;i<N;++i)
{
scanf("%d%d",&w[i],&d[i]);
}
for(j=0;j<=M;++j)
if(j>=w[0]) dp[0][j]=d[0];
for(i=1;i<N;++i)
{
for(j=0;j<=M;++j)
{
if(j>=w[i])
dp[i%2][j]=max(dp[(i+1)%2][j],dp[(i+1)%2][j-w[i]]+d[i]);
else
dp[i%2][j]=dp[(i+1)%2][j];
}
}
int ans=0;
for(j=0;j<=M;++j)
if(dp[(i+1)%2][j]>ans) {ans=dp[(i+1)%2][j]; }
printf("%d\n",ans);
}