题目链接:

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;
}
posted on 2022-03-10 11:05  Hamine  阅读(36)  评论(0编辑  收藏  举报