Description
陈老师桌上的书有三堆,每一堆都有厚厚的一叠,你想逗一下陈老师,于是你设计一个最累的方式给他,让他把书 拿下来给同学们。若告诉你这三堆分别有i,j,k本书,以及每堆从下到上书的质量,每次取书只能从任一堆的最上 面取,显然,每次取书陈老师的体力消耗都会加大,这里用体力系数代表,取下第一本书时,体力系数为1,第二 本书时体力系数为2,依次类推,而每次体力消耗值则为体力系数与书的重量之积。书最多有100本。
Format
Input
第一行3个整数,分别为三堆书的数量i,j,k; 第二行至第四行分别为每堆由下至上的书本重量。.
Output
一行,输出最累方式的体力消耗总值
Samples
输入数据 1
3 2 4
2 3 2
1 5
9 8 7 4
输出数据 1
257
Limitation
1s, 1024KiB for each test case.
思路:看看那堆上面的数字最小,就选那个数乘上第几本书就行了
CODE:
#include <bits/stdc++.h>
using namespace std;
int x, y, z, a[100001], b[100001], c[100001], n, now, max1 = -1;
void dfs(int aa, int bb, int cc) {
if (aa == 0 && bb == 0 && cc == 0) {//如果都搬下来了
max1 = max(now, max1);
return ;
}
int sum = n - aa - bb - cc + 1;
if (aa) {//如果这一叠还有的话
now += a[aa] * sum;
dfs(aa - 1, bb, cc);
now -= a[aa] * sum;//回溯
}
if (bb) {//同上
now += b[bb] * sum;
dfs(aa, bb - 1, cc);
now -= b[bb] * sum;
}
if (cc) {
now += c[cc] * sum;
dfs(aa, bb, cc - 1);
now -= c[cc] * sum;
}
}
int main() {
cin >> x >> y >> z;
for (int i = 1; i <= x; i++)
cin >> a[i];
for (int i = 1; i <= y; i++)
cin >> b[i];
for (int i = 1; i <= z; i++)
cin >> c[i];
n = x + y + z;
dfs(x, y, z);//递归开始
cout << max1 << endl;
return 0;
}