题目描述 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; }