题目描述:
某个充电站,可提供n个充电设备,每个充电设备均有对应的输出功率。任意个充电设备组合的输出功率总和,均构成功率集合P的1个元素。功率集合P的最优元素,表示最接近充电站最大输出功率p_max的元素。
输入描述
输入为3行:
第1行为充电设备个数n。
第2行为每个充电设备的输出功率。
第3行为充电站最大输出功率p_max。
输出描述
功率集合P的最优元素
示例1
输入输出示例仅供调试,后台判题数据一般不包含示例
输入
4
50 20 20 60
90
输出
90
说明
当充电设备输出功率50、20、20组合时,其输出功率总和为90,最接近充电站最大充电输出功率,因此最优元素为90。
示例2
输入输出示例仅供调试,后台判题数据一般不包含示例
输入
2
50 40
30
输出
0
说明
所有充电设备的输出功率组合,均大于充电站最大充电输出功率30,此时最优元素值为0。
备注
1.充电设备个数n>0
2.最优元素必须小于或等于充电站最大输出功率p_max。
代码实现:
方法一:二维dp数组
1、首先,我们定义了一个函数 getResult(n, output, p_max) 来解决这个问题。
2、在这个函数中,我们首先创建了一个二维数组 dp。这个数组用来存储子问题的解。dp[i][j] 表示前 i 个充电设备,总功率不超过 j 的最大输出功率。
3、我们使用 memset 函数将整个 dp 数组初始化为 0。
4、接下来,我们初始化 dp 数组的第一行。对于 j >= output0,我们将 dp[0][j] 设置为 output[0]。这是因为如果只有一个充电设备,且总功率不超过它的输出功率,那么最大输出功率就是它自己的输出功率。
5、然后,我们开始填充 dp 数组的其他单元格。对于每个充电设备 i 和总功率 j,我们有两种选择:
如果 j < outputi,那么最大输出功率就是不选择当前充电设备时的最大输出功率,即 dp[i-1][j]。
如果 j >= outputi,那么我们有两种选择:选择当前充电设备或不选择当前充电设备。我们取这两种选择中的最大值,即 fmax(dp[i-1][j], dp[i-1][j-output[i]]+output[i])。
6、在填充完 dp 数组后,我们打印出 dp 数组的内容,这可以帮助我们调试和理解代码的逻辑。
7、最后,我们返回 dp[n-1][p_max]。这个值就是前 n 个充电设备,总功率不超过 p_max 的最大输出功率。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int getResult(int n,int* output,int p_max){
int dp[n][p_max+1];
memset(dp,0,sizeof(int)*n*(p_max+1));
int i,j;
for(j=output