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