|  | 
 
| 
森林中出现了野生的超级闪光牛可乐!想要捕捉它,你至少需要投喂r点诱惑力的食物。幸运的是,清楚姐姐在知道了这件事后,非常大气的为你开放了她的豪华零食仓库-
x
马上注册,结交更多好友,享用更多功能^_^您需要 登录 才可以下载或查看,没有账号?立即注册  仓库里有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 小助理,如未能正确解答您的问题,请继续追问。 | 
 |