前言:这个有大前提的背包感觉不能用二进制拆分,不然搞不清楚
注意三维的顺便,第一维度是枚举物品,第二维度是倒序枚举空间,第三维度是枚举数量
题目地址
#include<bits/stdc++.h>
using namespace std;#define int long long
const int N = 305;
int cost[N];int val[N];
int n,x;
int dp[500];
int att[N],price[N],c[N],gra[N],lmax[N];signed main(){cin >> n >> x;for(int i=1;i<=n;i++){cin >> att[i] >> price[i] >> c[i] >> gra[i] >> lmax[i];}for(int i=1;i<=n;i++){for(int j=x;j>=price[i];j--){for(int k=0;price[i]+k*c[i]<=j && k <=lmax[i];k++){dp[j] = max(dp[j],dp[j-(price[i]+k*c[i])] + att[i] + k*gra[i]);}}}cout << dp[x];return 0;
}