有N件物品和容积为V的背包,每件物品有着各自的价格和体积,求将那些物品装入背包可是价值总和最大
每件物品只有一件,因此,我们可以将物品一个个放入“背包”中来看看当前的最优解是什么。
我们可以开一个数组来代替背包,将物品放入能容纳它的位置,不断的对比和更新当前的最大价值。
由于每件物品只有一个,因此我们可以从倒着更新数组。
#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 = m; j >= num[i].w; j--)
DP[j] = max(DP[j], DP[j - num[i].w] + num[i].p);
printf("%d\n", DP[m]);
}
return 0;
}