1.某个充电站,可提供n个充电设备,每个充电设备均有对应的输出功率。任意个充电设备组合的输出功率总和,均构成功率集合P的1个元素。功率集合P的最优元素,表示最接近充电站的最大输出功率p_max的元素。
- 输入(4,{50,20,20,60},90)
- 输出90
- 说明:当充电设备输出功率50,20,20组合时,其输出功率总和为90,最接近充电站最大充电输出功率
int select_power(int n, vector<int> powers, int p_max)
{
vector<bool> dp(p_max + 1, false);
dp[0] = true;
for (int i = 0; i < n; i++)
{
for (int j = p_max; j >= powers[i]; j--)
{
dp[j] = dp[j] || dp[j - powers[i]];
if (dp[j])
{
cout << i << j << powers[i] << endl;
}
}
}
for (int j = p_max; j >= 0; j--)
{
if (dp[j])
{
return j;
}
}
return 0;
}
这个程序定义了一个函数 select_power,它接受三个参数:充电设备的数量 n,每个充电设备的输出功率向量 powers,以及最大输出功率 p_max。函数首先定义了一个布尔型向量 dp,其中 dp[j] 表示能否组合出输出功率为 j 的元素。dp[0] 被初始化为 true,因为任何集合的总输出功率为 0。
然后,函数使用动态规划算法,从第一个充电设备到最后一个充电设备进行遍历。对于第 i 个充电设备,它从大到小遍历 p_max 到 powers[i],并且更新 dp 数组。具体地说,如果 dp[j - powers[i]] 为 true,那么 dp[j] 也为 true。这个递推式表示,如果我们可以组合出输出功率为 j - powers[i] 的元素,则我们可以在前 i 个充电设备中选择某些充电设备,加入到这个集合中,从而组合出输出功率为 j 的元素。
最后,函数从 p_max 到 0 进行遍历,返回最大的 j,使得 dp[j] 为 true。这个 j 就是集合 P 的最优元素。