学习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