|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
森林中出现了野生的超级闪光牛可乐!想要捕捉它,你至少需要投喂r点诱惑力的食物。幸运的是,清楚姐姐在知道了这件事后,非常大气的为你开放了她的豪华零食仓库-
仓库里有n种不同名称的食物,第i种食物能提供wi点的诱惑力。当你所投喂食物的诱惑力之和不小于x时,就可以顺利的捕捉到它。
现在,你可以从仓库中取走一些食物了,不管怎么说,今天的目标只有一个,那就是拿下超级闪光牛可乐!
输入描述:
每个测试文件仅有一组测试数据。
第一行输入一个整数 x(1≤x≤1000)表示至少需要多少诱惑力的食物才能捕捉这一只超级闪光牛可乐。
第二行输入一个整数 n(1≤n≤26)表示清楚姐姐豪华零食仓库中的零食种类数量。
随后 n 行,每行输入一个小写字母 ch 和一个整数 w ('a'≤ch≤'z',1≤w≤500),表示第i 种零食的名称以及提供的诱惑力。保证零食的名称不重复;使用
单个空格间隔。
输出描述:
你需要在一行上输出一个由小写字母组成的答案字符串,代表你要喂给超级闪光牛可乐的食物。但是请注意,喂食的零食数量不能超过1000个,否则牛可乐会因为吃
不下而直接离开。清楚姐姐仓库中没有的零食种类提供的诱惑力会被视为0。
如果无法捕获牛可乐,仅需输出一行-1。
没思路
当然可以!下面是用 C++ 完整实现的代码:
- #include <iostream>
- #include <vector>
- using namespace std;
- struct Food {
- char name;
- int tempt;
- };
- int main() {
- int x, n;
- cin >> x >> n;
- vector<Food> foods(n);
- for (int i = 0; i < n; i++) {
- cin >> foods[i].name >> foods[i].tempt;
- }
- vector<vector<int>> dp(n + 1, vector<int>(x + 1, 1001)); // 初始化 dp 数组
- dp[0][0] = 0;
- for (int i = 1; i <= n; i++) {
- dp[i][0] = 0;
- for (int j = 1; j <= x; j++) {
- dp[i][j] = dp[i - 1][j];
- if (j >= foods[i - 1].tempt) {
- dp[i][j] = min(dp[i][j], dp[i - 1][j - foods[i - 1].tempt] + 1);
- }
- }
- }
- if (dp[n][x] > 1000) { // 无法捕获牛可乐
- cout << -1 << endl;
- } else {
- string ans;
- int i = n, j = x;
- while (i > 0 && j > 0) {
- if (dp[i][j] == dp[i - 1][j]) { // 没有取这个食物
- i--;
- } else { // 取了这个食物
- ans = foods[i - 1].name + ans;
- j -= foods[i - 1].tempt;
- }
- }
- cout << ans << endl;
- }
- return 0;
- }
复制代码
希望这段代码能够帮到你!如果还有其他问题,请随时提问。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
|
|