LeetCode 第46天 | 139. 单词拆分 56. 携带矿石资源(多重背包问题)动态规划

139. 单词拆分
挺巧妙的一道题,但是我没有时间和心情去总结了。考研成绩出了,我要准备复试内容了。

class Solution {
public:
    bool wordBreak(string s, vector<string>& wordDict) {
        vector<bool> dp(s.size() + 1, false);
        dp[0] = true;
        unordered_set<string> uset(wordDict.begin(), wordDict.end());
        for (int i = 1; i <= s.size(); i++) {
            for (int j = 0; j < i; j++) {
                string word = s.substr(j, i - j);
                if (uset.find(word) != uset.end() && dp[j] == true) {
                    dp[i] = true;
                }
            }
        }
        return dp[s.size()];
   }
};

56. 携带矿石资源(第八期模拟笔试)
题目描述
你是一名宇航员,即将前往一个遥远的行星。在这个行星上,有许多不同类型的矿石资源,每种矿石都有不同的重要性和价值。你需要选择哪些矿石带回地球,但你的宇航舱有一定的容量限制。

给定一个宇航舱,最大容量为 C。现在有 N 种不同类型的矿石,每种矿石有一个重量 w[i],一个价值 v[i],以及最多 k[i] 个可用。不同类型的矿石在地球上的市场价值不同。你需要计算如何在不超过宇航舱容量的情况下,最大化你所能获取的总价值。

输入描述
输入共包括四行,第一行包含两个整数 C 和 N,分别表示宇航舱的容量和矿石的种类数量。

接下来的三行,每行包含 N 个正整数。具体如下:

第二行包含 N 个整数,表示 N 种矿石的重量。

第三行包含 N 个整数,表示 N 种矿石的价格。

第四行包含 N 个整数,表示 N 种矿石的可用数量上限。

输出描述
输出一个整数,代表获取的最大价值。
输入示例
10 3
1 3 4
15 20 30
2 3 2
输出示例
90
提示信息
数据范围:
1 <= C <= 10000;
1 <= N <= 10000;
1 <= w[i], v[i], k[i] <= 10000;

多重背包问题,力扣上没有,可以转化为01背包问题,多加一个循环

#include<iostream>
#include<vector>
using namespace std;
int main() {
    int bagWeight,n;
    cin>>bagWeight>>n;
    vector<int> w(n);
    vector<int> v(n);
    vector<int> k(n);
    for (int i = 0; i < n; i++) {
        cin>>w[i];
    }
    for (int i = 0; i < n; i++) {
        cin>>v[i];
    }
    for (int i = 0; i < n; i++) {
        cin>>k[i];
    }
    vector<int> dp(bagWeight+1, 0);
    for (int i = 0; i < n; i++) {
        for (int j = bagWeight; j >= w[i]; j--) {
            for (int p = 1; p <= k[i] && (j-p*w[i]) >= 0; p++) {
                dp[j] = max(dp[j], dp[j-p*w[i]]+p*v[i]);
            }
        }
    }
    cout<<dp[bagWeight];
}

  • 9
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值