http://poj.org/problem?id=3624
源代码:
#include<iostream>
#include<cstdlib>
#include<cstdio>
using namespace std;
#define N 3410
int m[N][N];
int w[N];
int v[N];
int max(int a,int b);
int min(int a,int b);
int knapsack(int n,int c,int m[][N]);
int main()
{
int n,c;
while(scanf("%d %d",&n,&c)!=EOF)
{
for(int i=1;i<=n;i++)
scanf("%d %d",&w[i],&v[i]);
int max=knapsack(n,c,m);
printf("%d\n",max);
}
return 0;
}
int max(int a,int b)
{
return a>b?a:b;
}
int min(int a,int b)
{
return a<b?a:b;
}
int knapsack(int n,int c,int m[][N])
{
int i,j;
int jmax=min(w[n]-1,c);
for(j=0;j<=jmax;j++)
m[n][j]=0;
for(j=w[n];j<=c;j++)
m[n][j]=v[n];
for(i=n-1;i>1;i--)
{
jmax=min(w[i]-1,c);
for(j=0;j<=jmax;j++)
m[i][j]=m[i+1][j];
for(j=w[i];j<=c;j++)
m[i][j]=max(m[i+1][j],m[i+1][j-w[i]]+v[i]);
}
m[1][c]=m[2][c];
if(c>=w[1])m[1][c]=max(m[1][c],m[2][c-w[1]]+v[1]);
return m[1][c];
}