题目描述
P1776 宝物筛选
解法:多重背包
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n, m, ans, cnt = 1;
scanf("%d%d", &n, &m);
int dp[1000005], vvol[1000005], vval[1000005];
int val, vol, num;
for(int i=1;i<=n;i++)
{
scanf("%d%d%d", &val, &vol, &num);
for(int j=1;j<=num;j<<=1)
{
vval[cnt] = j*val;
vvol[cnt] = j*vol;
cnt++;
num -= j;
}
if(num)
{
vval[cnt] = num*val;
vvol[cnt] = num*vol;
cnt++;
}
}
for(int i=1;i<cnt;i++)
for(int j=m;j>=vvol[i];--j)
dp[j] = max(dp[j], dp[j-vvol[i]]+vval[i]);
printf("%d\n", dp[m]);
return 0;
}