1 条题解

  • 0
    @ 2025-8-24 21:36:58

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar 引领天下
    用6年时间,讲好一个笑话。

    搬运于2025-08-24 21:36:58,当前版本为作者最后更新于2017-11-11 09:01:16,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    为什么要用DP呢?

    用DFS多好。

    每次搜一堆,一直搜下去,找最大值,不就行了吗???

    DP多难写啊。

    #谨以此题解祝我下午NOIP RP=无限大!

    上代码:

    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    #include <string>
    #include <cmath>
    #include <iostream>
    using namespace std;
    int w[4][101],n,i,j,k;
    long long ans,now;//用long long,防爆
    void in(){
        scanf ("%d%d%d",&i,&j,&k),n=i+j+k;//n是书的总数,i,j,k为123堆
        for (int t=1;t<=i;t++)scanf ("%d",&w[1][t]);//读入书
        for (int t=1;t<=j;t++)scanf ("%d",&w[2][t]);
        for (int t=1;t<=k;t++)scanf ("%d",&w[3][t]);
    }
    void dfs(int a,int b,int c){//DFS
        int x;
        if (a+b+c==0){
            if (now>ans)ans=now;
            return;//搬完了,更新答案
        }
        x=n-(a+b+c)+1;//搬这本书需要的体力
        if (a>0){//如果有才搜
            now+=w[1][a]*x;//递归前加
            dfs(a-1,b,c);//搬一本(第一堆)
            now-=w[1][a]*x;//改回去
        }//以下原理同上
        if (b>0){
            now+=w[2][b]*x;
            dfs(a,b-1,c);
            now-=w[2][b]*x;
        }
        if (c>0){
            now+=w[3][c]*x;
            dfs(a,b,c-1);
            now-=w[3][c]*x;
        }
    }
    int main(){
        in();//读入
        dfs(i,j,k);//DFS
        printf ("%lld",ans);//输出
        return 0;
    }
    
    • 1

    信息

    ID
    1382
    时间
    1000ms
    内存
    125MiB
    难度
    2
    标签
    (无)
    递交数
    0
    已通过
    0
    上传者