同样的,我们一个一定体积的背包与大量的物品,每个物品有着各自的体积和价值,每个物品有无数个,求价值最大的解法
我们可以开一个数组来代替背包,然后当前物品不断放入,同时更新最大价值。
在这里我们可以从第一个能放入当前物品的地方向后更新,每次将当前价值和放入当前物品后的价值进行对比。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int MAXN = 10005;
struct node
{
int w;
int p;
} num[MAXN];
int DP[MAXN];
int main()
{
int n, m;
while(~scanf("%d%d", &n, &m))
{
memset(DP, 0, sizeof(DP));
for(int i = 1; i <= n; i++)
scanf("%d%d", &num[i].w, &num[i].p);
for(int i = 1; i <= n; i++)
for(int j = num[i].w; j <= m; j++)
DP[j] = max(DP[j], DP[j - num[i].w] + num[i].p);
printf("%d\n", DP[m]);
}
return 0;
}