多重背包变形
题目链接
思路
英雄拥有有限个皮肤,联想到多重背包,发现没有背包容量,我们可以假令所有的都购入为总的背包容量,背包价值为展示皮肤总方案,打完全背包板子就行
ACcode
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int M = 1e6 + 9;
int dp[M]={1};
signed main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int n, m;cin >> n >> m;
vector<int>a(n + 3), b(n + 3);
int pm = 0;
for (int i = 1;i <= n;i++)cin >> a[i];
for (int i = 1;i <= n;i++) {
cin >> b[i];
pm += a[i] * b[i];
}
for (int i = 1;i <= n;i++) {
for (int j = pm;j >= 0;j--) {
for (int k = 0;k <= a[i] && k * b[i] <= j;k++) {
dp[j]=max(dp[j],dp[j-b[i]*k]*k);
}
}
}
int ans = 0;
while (ans < pm && dp[ans] < m)ans++;
cout << ans;
return 0;
}