站外完全背包板子题……求调
  • 板块学术版
  • 楼主lzy20091001
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/7/30 11:10
  • 上次更新2023/11/3 06:56:56
查看原帖
站外完全背包板子题……求调
932039
lzy20091001楼主2023/7/30 11:10

最后输出This is impossible.的地方有问题……求调。

[HDU1114] 存钱罐

题目描述

存钱罐有个大问题,不打碎存钱罐,就无法确定里面有多少钱,所以可能会出现把存钱罐打碎后发现钱不够的情况。唯一的可能是,称一下存钱罐的重量,试着猜里面有多少钱。已知存钱罐的重量和每种面值的硬币重量,请确定存钱罐内的最小金额。

输入格式

输入的第1行包含整数 TT ,表示测试用例的数量。每个测试用例的第1行都包含两个整数 ee 和 ff (1≤e≤f≤100001 \le e \le f \le 10000),分别表示空存钱罐和装满硬币存钱罐的重量(以克计)。第2行包含一个整数nn(1≤n≤5001 \le n \le 500),表示硬币的总数量。接下来的 nn 行,每行都包含两个整数 pp 和 ww ( 1≤p≤500001 \le p \le 50000 , 1≤w≤100001 \le w \le 10000 ),分别表示硬币的面值和重量。

输出格式

对每个测试样例,都输出一行,包含The minimum amount of money in the piggy-bank is x.,其中 xx 是存钱罐内的最小金额。若无法确定,则输出This is impossible.。

样例 #1

样例输入

3
10 110
2
1 1
30 50
10 110
2
1 1
50 30
1 6
2
10 3
20 4

样例输出

The minimum amount of money in the piggy-bank is 60.
The minimum amount of money in the piggy-bank is 100.
This is impossible.

我的代码

#include <iostream>
#include <climits>
#include <cstring>
#include <algorithm>
using namespace std;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    
    int t, e, f, n, p[505] = {}, w[505] = {}, dp[10005] = {};
    cin >> t;
    while (t--)
    {
        memset(p, 0, sizeof(p));
        memset(w, 0, sizeof(w));
        dp[0] = 0;
        for (int i = 1; i < 10005; i++)
            dp[i] = INT_MAX;
        cin >> e >> f >> n;
        for (int i = 1; i <= n; i++)
            cin >> p[i] >> w[i];
        for (int i = 1; i <= n; i++)
            for (int j = w[i]; j <= f - e; j++)
                dp[j] = min(dp[j], dp[j - w[i]] + p[i]);
        if (dp[f - e] < INT_MAX)
            cout << "The minimum amount of money in the piggy-bank is " << dp[f - e] << "." << "\n";
        else
            cout << "This is impossible." << "\n";
    }
    return 0;
}

2023/7/30 11:10
加载中...