2021-3-13-[编程题]风电场风机发电调度问题

题目描述:
某风机场每台风机的发电量和距离升压站的距离各不相同,
如风机1,距离为30, 发电量为20;
风机2,距离为20,发电量为18;
风机3,距离为35, 发电量为25;
风机4,距离为40, 发电量为30;
求在所有风机总距离一定的情况下(例如距离<=100),最大发电量。
输入:
第一行:每台风机距离
第二行:每台风机发电量
第三行:总距离k
例如:
30 20 35 40
20 18 25 30
50
输出:38

//题解:可以看成背包问题,距离看作物品重量,发电量看作物品价值,总距离看作背包容量

#include 
#include 
#include 
#include 
#include 

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;
}

你可能感兴趣的:(c++)