2024-07-30 14:50阅读: 1评论: 0推荐: 0

二维费用背包问题

宠物小精灵之收服

题解:设状态 dp[i][j][k] 表示从前 i 个物品中选择,物品的费用 1j,费用 2k 的最大选择数量。

则状态转移方程为:

dp[i][j][k]=max(dp[i1][j][k],dp[i1][jv1[i]][kv2[i]]+1)

跟普通01背包一样,第一维可以直接优化掉。
第一问的答案显然为 dp[n][m1] (注意本题中体力不能为0),第二问的答案枚举满足 dp[n][i]=dp[n][m1] 的最大的 mi 即为答案。

AC代码:

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

const int N = 1010;
int dp[N][N];
int v[N], w[N];

void solve() {
    int n, m, k;
    cin >> n >> m >> k;
    for (int i = 1; i <= k; i ++) {
        cin >> v[i] >> w[i];
    }
    
    for (int i = 1; i <= k; i ++) {
        for (int j = n; j >= v[i]; j --) {
            for (int t = m - 1; t >= w[i]; t --) {
                dp[j][t] = max(dp[j][t], dp[j - v[i]][t - w[i]] + 1);
            }
        }
    }
    
    int res = 1e9;
    for (int i = 0; i < m; i ++) {
        if(dp[n][i] == dp[n][m - 1]) {
            res = min(res, i);
            break;
        }
    }
    
    cout << dp[n][m - 1] << " " << m - res << endl;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    
    solve();
}

本文作者:弱弱的Ray

本文链接:https://www.cnblogs.com/Ray0430/p/18332398

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   弱弱的Ray  阅读(1)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 2分钟学会 DeepSeek API,竟然比官方更好用!
· .NET 使用 DeepSeek R1 开发智能 AI 客户端
· DeepSeek本地性能调优
· autohue.js:让你的图片和背景融为一体,绝了!
· 10亿数据,如何做迁移?
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起
  1. 1 404 not found REOL
404 not found - REOL
00:00 / 00:00
An audio error has occurred.