小猴编程周赛C++ | 2022年秋第7周T2能量珠

学习C++从娃娃抓起!记录下在学而思小猴编程学习过程中的题目,记录每一个瞬间。侵权即删,谢谢支持!

附上汇总贴:小猴编程C++ | 汇总-CSDN博客


【题目描述】
小猴乘火箭到了Mars星球上,Mars星上有很多能量珠。
小猴找到了 n n n个能量珠,第 i i i个能量珠的大小为 a i a_i ai。两个能量珠通过连接,可以释放出能量,一个大小为 x x x和一个大小为 y y y的能量珠连接,可以释放出能量为 x × y x\times y x×y
小猴打算选取总大小不超过 m m m的能量珠,把它们按照序号从小到大的顺序,依次连接在一起,求他能得到的最大能量。
例如,小猴选取大小为 1 , 2 , 5 , 10 1,2,5,10 1,2,5,10的能量珠,他可以获得的能量为 1 × 2 + 2 × 5 + 5 × 10 = 62 1\times 2+2\times 5+5\times 10=62 1×2+2×5+5×10=62
【输入】
1 1 1行, 2 2 2个整数 n , m n,m n,m
2 2 2行, n n n个正整数 a 1 , a 2 , … , a n a_1,a_2,\dots,a_n a1,a2,,an
【输出】
1 1 1个整数,输出能得到的最大能量。
【输入样例】

4 11
1 5 10 2

【输出样例】

15

【代码详解】
[图片]

[图片]

#include <bits/stdc++.h>
using namespace std;
int n, m, maxn=-1e9;
int a[105], dp[105][5005];
int main()
{
    cin >> n >> m;
    for (int i=1; i<=n; i++) {  // 输入n个能量珠
        cin >> a[i];
    }
    for (int i=1; i<=n; i++) {  // 背包模拟
        for (int j=0; j<=m; j++) {
            for (int k=1; k<=i-1; k++) {  // 枚举a_i上一个珠
                if (j-a[i]>=a[k]) {  // 以a_k结尾的珠子总大小是j-a_i,这要求j-a_i中至少有a_k的大小
                    dp[i][j] = max(dp[i][j], dp[k][j-a[i]] + a[k]*a[i]);
                }
            }
        }
    }
    for (int i=1; i<=n; i++) { // 枚举1~n中dp[i][m]的最大值
        maxn = max(maxn, dp[i][m]);
    }
    cout << maxn << endl;
    return 0;
}

【运行结果】

4 11
1 5 10 2
15
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值