• 01背包---P2392 kkksc03考前临时抱佛脚


    P2392 kkksc03考前临时抱佛脚

    题解

    01背包,类似于这道题,相似度99.999999%:

    01-背包 P2663 越越的组队

     
    一共有4科,每科的时间独立,然后每一科做一遍 P2663越越的组队,时间之和累加得到答案
     
    考虑复习每一科的最短时间
    由于可以左右脑并用,所以把题目简化一下就是把所有题目分成两组,取时间最长的一组作为答案,但是要使得时间最长的一组它的时间尽量短
    我们知道两组数值越接近,肯定就是最优答案了
     

    代码

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<algorithm>
    #include<string>
    #include<cstring>
    #include<queue>
    
    using namespace std;
    
    typedef long long ll;
    
    inline int read()
    {
        int ans=0;
        char last=' ',ch=getchar();
        while(ch<'0'||ch>'9') last=' ',ch=getchar();
        while(ch>='0'&&ch<='9') ans=ans*10+ch-'0',ch=getchar();
        if(last=='-') ans=-ans;
        return ans;
    }
    
    int cnt[5],s[25];
    int f[3000];
    int ans=0,tot=0,ave=0;
    
    int main()
    {
        for(int i=1;i<=4;i++) cnt[i]=read();
        for(int t=1;t<=4;t++){
            memset(s,0,sizeof(s));
            memset(f,0,sizeof(f));
            tot=0,ave=0;
            for(int i=1;i<=cnt[t];i++) s[i]=read(),tot+=s[i];
            ave=tot/2;
            for(int i=1;i<=cnt[t];i++)
                for(int j=ave;j>=s[i];j--)
                    f[j]=max(f[j],f[j-s[i]]+s[i]);
            ans+=(tot-f[ave]);
        }
        printf("%d
    ",ans);
        
        return 0;
    }
  • 相关阅读:
    数组,一维,二维,多维
    类函数:string、math
    while和for的内嵌
    循环语言(for)
    选择语言之switch case
    程序语言
    语言、数据和运算符
    原理之一,进制转换
    HTML第一部分
    结构体共用变量 递归
  • 原文地址:https://www.cnblogs.com/xiaoyezi-wink/p/11983927.html
Copyright © 2020-2023  润新知