实例参考搜索法文章
#include <bits/stdc++.h>
#define MAXN 100
using namespace std;
int n, MaxValue;
int w[MAXN+1], v[MAXN+1];
int dp[MAXN+1][MAXN+1];
int main()
{
memset(dp, 0, sizeof(dp));
scanf("%d", &n );
for( int i=0; i<n; i++ )
scanf("%d%d", &w[i], &v[i] );
scanf("%d", &MaxValue );
// dp[i][j] 的含义为从第i个物品开始挑选总重小于j时,总价值的最大值.
// 以下的用二重循环递推得到结果,这种方式把给定范围dp数组总所有的元素都访问了一遍
// 与用递归记忆法搜索不同的是,搜索只访问dp的一些特定位置
for( int i=n-1; i>=0; i-- ) // 当前位置的总价值由前一个位置的总价值得到
{
for( int j=0; j<=MaxValue; j++ )
{
if( j<w[i] )
dp[i][j] = dp[i+1][j];
else
dp[i][j] = max( dp[i+1][j], dp[i+1][j-w[i]]+v[i] );
}
}
printf("%d\n", dp[0][MaxValue] );
return 0;
}