8615 快乐

### 分析
这是一个典型的背包问题。我们需要在有限的精力(背包容量)下,选择若干题目(物品),使得获得的快乐指数(价值)最大。可以使用动态规划来解决这个问题。需要注意的是,Lian初始的快乐指数为1。

### 伪代码
1. 定义一个二维数组`dp`,其中`dp[i][j]`表示前i道题目在精力为j时能获得的最大快乐指数。
2. 初始化`dp[0][j]`为1,表示没有题目时快乐指数为1。
3. 遍历每一道题目,对于每一道题目,遍历精力值,从高到低更新`dp`数组。
4. 如果当前题目的消耗精力小于等于当前精力值,则更新`dp`数组。
5. 最后,遍历`dp[n][j]`,找到满足精力值大于0的最大快乐指数。

### 代码


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

int maxHappiness(int n, vector<int>& gethappy, vector<int>& losspow) {
    int maxPower = 2000;
    vector<vector<int>> dp(n + 1, vector<int>(maxPower + 1, 1));

    for (int i = 1; i <= n; ++i) {
        for (int j = maxPower; j >= losspow[i - 1]; --j) {
            dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - losspow[i - 1]] + gethappy[i - 1]);
        }
        for (int j = losspow[i - 1] - 1; j >= 0; --j) {
            dp[i][j] = dp[i - 1][j];
        }
    }

    int maxHappiness = 0;
    for (int j = 1; j <= maxPower; ++j) {
        maxHappiness = max(maxHappiness, dp[n][j]);
    }

    return maxHappiness;
}

int main() {
    int n;
    cin >> n;
    vector<int> gethappy(n);
    vector<int> losspow(n);
    for (int i = 0; i < n; ++i) {
        cin >> gethappy[i];
    }
    for (int i = 0; i < n; ++i) {
        cin >> losspow[i];
    }
    cout << maxHappiness(n, gethappy, losspow) << endl;
    return 0;
}


 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值