算法题练习

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 的最优元素。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值