远景笔试题
根据记忆描述:
某风机场每台风机的发电量和距离升压站的距离各不相同,如风机1,距离为30, 发电量为20;风机2,距离为20, 发电量为18;风机3,距离为35, 发电量为25;风机4,距离为40, 发电量为30;求在所有风机总距离一定的情况下(例如距离<=100),最大发电量。
输入:
第一行:每台风机距离。
第二行:每台风机发电量。
第三行:总距离k。
示例:
输入:
30 20 35 40
20 18 25 30
50
输出:
38
题解:
可以看成一个01背包问题,距离看做物品重量,发电量看做物品价值,总距离看做背包容量。
代码:
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include<stdlib.h>
using namespace std;
class Solution
{
public:
int findMax(vector<int>& dists, vector<int>& values, int k) {
int n = dists.size() - 1;
vector<vector<int>> dp(n + 1, vector<int>(k + 1, 0));
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= k; ++j) {
if (j >= dists[i]) {
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - dists[i]] + values[i]);
}
else {
dp[i][j] = dp[i - 1][j];
}
}
}
return dp[n][k];
}
};
int main()
{
Solution sol;
string str;
vector<int> dists;
dists.push_back(0);
vector<int> values;
values.push_back(0);
getline(cin, str);
while (str.find(' ') != -1) {
int pos = str.find(' ');
int num = stoi(str.substr(0, pos));
dists.push_back(num);
str = str.substr(pos + 1);
}
dists.push_back(stoi(str));
getline(cin, str);
while (str.find(' ') != -1) {
int pos = str.find(' ');
int num = stoi(str.substr(0, pos));
values.push_back(num);
str = str.substr(pos + 1);
}
values.push_back(stoi(str));
int k = 50;
cin >> k;
int res = sol.findMax(dists, values, k);
cout << res << endl;
return 0;
}