搬书(c++)

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;
}

猜你喜欢

转载自blog.csdn.net/weixin_55599629/article/details/120629558