2017"百度之星"程序设计大赛 - 资格赛 度度熊与邪恶大魔王 背包DP

本文通过使用动态规划方法解决了一类特殊的背包问题。该问题涉及物品的选取与费用的优化,通过对不同物品的选择来达到最优的总费用。代码中利用二维数组dp进行状态转移,有效地解决了问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

31 int n, m, a[MAXN * 100], b[MAXN * 100] , k[MAXN], p[MAXN];
32 int dp[11][MAXN];
33 
34 int main() {
35     ios::sync_with_stdio(false), cin.tie(0);
36     while (cin >> n >> m) {
37         rep(i, 0, n) cin >> a[i] >> b[i];
38         rep(i, 0, m) cin >> k[i] >> p[i];
39         memset(dp, 0x3f, sizeof(dp));
40         rep(i, 0, 11) dp[i][0] = 0;
41         rep(K, 0, 11) {
42             rep(i, 0, m) p[i] -= K;
43             rep(i, 0, 1001) rep(j, 0, m) if (p[j] > 0) {
44                 if (p[j] >= i) dp[K][i] = min(dp[K][i], k[j]);
45                 else dp[K][i] = min(dp[K][i], dp[K][i - p[j]] + k[j]);
46             }
47             rep(i, 0, m) p[i] += K;
48         }
49         ll ans = 0, fg = 1;
50         rep(i, 0, n) {
51             if (dp[b[i]][a[i]] == INF) {
52                 cout << -1 << endl;
53                 fg = 0;
54                 break;
55             }
56             ans = ans + dp[b[i]][a[i]];
57         }
58         if (fg) cout << ans << endl;
59     }
60     return 0;
61 }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值