题目链接:
http://39.98.219.132/problem/1847
题目大意
有 \(n\) 个英雄,每个英雄有 \(k_i\) 个皮肤,一个英雄所有皮肤的价格相同,都是 \(c_i\),现在希望买皮肤来展示,展示方案就是有皮肤的英雄就选择一个皮肤进行展示,希望花最少的费用使英雄皮肤的展示方案 >= \(m\)。例如现在有五个英雄,每个英雄分别有 0,0,3,2,5 个皮肤,总的展示方案就是 3 * 2 * 5 种。
思路:
简单多重背包,以价格作为物品的重量,方案数为物品价值。
接着用循环找到方案数大于等于要求的最小买皮肤的价格。
代码:
#include <bits/stdc++.h>
using namespace std;
#define LL long long
const int N = 1e6 + 10;
LL n, s, dp[N], a[N], b[N], ans, m;
int main(){
cin >> n >> m;
dp[0] = 1;
for (int i = 1; i <= n; ++ i)
cin >> a[i];
for (int i = 1; i <= n; ++ i){
cin >> b[i];
s += b[i] * a[i];
}
for (int i = 1; i <= n; ++ i)
for (int j = s; j >= 0; -- j)
for (int k = 0; k <= a[i]; ++ k)
if (j - k * b[i] >= 0)
dp[j] = max(dp[j], dp[j - k * b[i]] * k);
while (dp[ans] < m && ans <= s)
ans++;
cout << ans << "\n";
return 0;
}