zoukankan      html  css  js  c++  java
  • codevs2894、2837、1669、2503、3231

    6.25动态规划之背包回顾

    2894 Txx考试

     

     时间限制: 1 s
     空间限制: 32000 KB
     题目等级 : 黄金 Gold
     
     
     
    题目描述 Description

    Txx是一个成绩很差的人,考试便成了他的噩梦。于是他常在考试时睡觉以打发时间。今天他又要面临一次考试,为了保证有充足的睡眠,他决定只做k分钟题目。这次测试有n道题,第i题的得分是pi分,需要耗费ti分钟解决(将要完成也得不到分)。

    请你算出他最少扣多少分(总分是所有题目分值的总和)。

    输入描述 Input Description

    第一行k

    第二行n

    第三行到第n+2行每行两个数:ti和pi

    输出描述 Output Description

    Txx最少的扣分

    样例输入 Sample Input

    5

    3

    2 6

    1 3

    4 7

    样例输出 Sample Output

    6

    数据范围及提示 Data Size & Hint

    100%的数据中,k<=100000,ti<=10000,pi<=10000;

    30%的数据中,n<=20;

    100%的数据中,n<=500

    背包归类:01背包

    #include<cstdio>
    #include<iostream>
    using namespace std;
    #define N 101000
    int v[N],c[N],f[N],k,n,sum;
    int main(){
        scanf("%d%d",&k,&n);
        for(int i=1;i<=n;i++){
            scanf("%d%d",v+i,c+i);
            sum+=c[i];
        }
        for(int i=1;i<=n;i++){
            for(int j=k;j>=v[i];j--){
                f[j]=max(f[j],f[j-v[i]]+c[i]);
            }
        }
        printf("%d
    ",sum-f[k]);
        return 0;
    }

    2837 考前复习

     

     时间限制: 1 s
     空间限制: 128000 KB
     题目等级 : 黄金 Gold
     
     
     
    题目描述 Description

    Aiden马上要考试了,可他还没怎么复习,于是他决定临时抱佛脚。他列了N个知识点,并分析出了复习每个知识点所需的时间t以及可能获得的分数k。他现在还有T时间来复习,他希望选择正确的知识点来在最短的时间内获得最高的期望分数。

    输入描述 Input Description

    第一行,两个数,分别为N、T。

    接下来的N行,每行两个数t、k,表示一个知识点所需的时间和期望得分。

    输出描述 Output Description

    一行,一个数,表示可以获得的最高期望得分。

    样例输入 Sample Input

    3 5

    3 5

    3 2

    2 2

    样例输出 Sample Output

    7

    数据范围及提示 Data Size & Hint

    对于10%的数据,0<N≤10,0<T≤100。

    对于50%的数据,0<N≤1000,0<T≤10000。

    对于100%的数据,0<N≤5000,0<T≤10000,0<t,k≤1000。

    背包归类:01背包

    #include<cstdio>
    #include<iostream>
    using namespace std;
    #define N 101000
    int v[N],c[N],f[N],k,n;
    int main(){
        scanf("%d%d",&n,&k);
        for(int i=1;i<=n;i++){
            scanf("%d%d",v+i,c+i);
        }
        for(int i=1;i<=n;i++){
            for(int j=k;j>=v[i];j--){
                f[j]=max(f[j],f[j-v[i]]+c[i]);
            }
        }
        printf("%d
    ",f[k]);
        return 0;
    }

    1669 运输装备

     

     时间限制: 1 s
     空间限制: 256000 KB
     题目等级 : 钻石 Diamond
     
     
     
    题目描述 Description

    德国放松对英国的进攻后,把矛头指向了东北——苏联。 1943年初,东线的站头进行到白热化阶段。据可靠情报,90余万德国军队在库尔斯克准备发动好大的攻势。因此,朱可夫元帅要求你立即从远东的军工厂运输大量装备支援库尔斯克前线。 列车司机告诉你,一趟列车最多可以容纳V体积的武器装备,但是你可能不能装满,因为列车承受不了那么大的重量,一趟列车最多可以承载G单位的重量。同时,军工厂仓库提供给你一份装备清单,详细记录了每件装备的体积、重量和火力。为了有效支援朱可夫元帅,你要找到一种方案,使得总火力值最大。

    输入描述 Input Description

    第一行:V和G表示最大重量和体积。 第二行:N表示仓库有N件装备; 第三到N+2行:每行3个数Ti  Vi  Gi表示个装备的火力值、体积和重量;

    输出描述 Output Description

    输出一个数,表示可能获得的最大火力值

    样例输入 Sample Input

    6 5

    4

    10 2  2

    20 3  2

    40  4  3

    30  3  3

    样例输出 Sample Output

    50

    数据范围及提示 Data Size & Hint

    【数据范围】

    对于50%的数据,V,G,N≤100

    对于100%的数据,V,G,N≤1000

    背包归类:二维费用背包

    #include<cstdio>
    #include<iostream>
    using namespace std;
    #define N 1010
    int v[N],c[N],g[N],f[N][N],m,n,q;
    int main(){
        scanf("%d%d%d",&n,&m,&q);
        for(int i=1;i<=q;i++){
            scanf("%d%d%d",c+i,v+i,g+i);
        }
        for(int i=1;i<=q;i++){
            for(int j=v[i];j<=n;j++){
                for(int k=g[i];k<=m;k++){
                    f[j][k]=max(f[j][k],f[j-v[i]][k-g[i]]+c[i]);
                }
            }
        }
        printf("%d
    ",f[n][m]);
        return 0;
    }

    2503 失恋28天-缝补礼物

     

     时间限制: 1 s
     空间限制: 32000 KB
     题目等级 : 黄金 Gold
     
     
     
    题目描述 Description

      话说上回他给女孩送了n件礼物,由于是廉价的所以全部都坏掉了,女孩很在意这些礼物,所以决定自己缝补,但是人生苦短啊,女孩时间有限,她总共有m分钟能去缝补礼物。由于损坏程度不一样所以缝补的时间p也是不一样的,每件礼物呢,都有一个女孩的喜爱程度为w,后面还有一个数字h为这种礼物的件数。女孩想让自己的喜爱程度的和最大,那么请聪明的你帮她算一算!(注意:礼物非常多,不一定都能缝补完,女孩也不用把所有时间都花费)

    输入描述 Input Description

    第1行2个整数 m,n
    第2行到第n+1行 每行三个整数 p,w,h

    输出描述 Output Description

    一个整数s表示最大的喜爱程度

    样例输入 Sample Input

    8 2
    2 100 4
    4 100 2

    样例输出 Sample Output

    400

    数据范围及提示 Data Size & Hint

    m<=10000

    n<=100

    p,h,w<=6000

    背包归类:多重背包
    朴素算法
    #include<cstdio>
    #include<iostream>
    using namespace std;
    #define N 10100
    int v[N],c[N],s[N],f[N],n,m;
    int main(){
        scanf("%d%d",&m,&n);
        for(int i=1;i<=n;i++){
            scanf("%d%d%d",v+i,c+i,s+i);
        }
        for(int i=1;i<=n;i++){
            for(int j=m;j>=0;j--){
                for(int k=0;k<=s[i];k++){
                    if(j-k*v[i]<0) break;
                    f[j]=max(f[j],f[j-k*v[i]]+k*c[i]);
                }
            }
        }
        printf("%d
    ",f[m]);
        return 0;
    }

    二进制优化

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    #define N 10010
    int e[30],v[N],c[N],f[N],m,n,n1;
    int main(){
        for(int i=0;i<=28;i++) e[i]=1<<i;
        scanf("%d%d",&m,&n);
        for(int i=1,x,y,s;i<=n;i++){
            scanf("%d%d%d",&x,&y,&s);
            int t=0;
            while(s>=e[t]){
                v[++n1]=x*e[t];
                c[n1]=y*e[t];
                s-=e[t++];
            }
            if(s){
                v[++n1]=x*s;
                c[n1]=y*s;
            }
        }
        for(int i=1;i<=n1;i++){
            for(int j=m;j>=v[i];j--){
                f[j]=max(f[j],f[j-v[i]]+c[i]);
            }
        }
        printf("%d
    ",f[m]);
        return 0;
    }

    3231 小吃

     

     时间限制: 1 s
     空间限制: 16000 KB
     题目等级 : 黄金 Gold
     
     
     
    题目描述 Description

    这里简直是吃货的天堂,小吃太多了。数不胜数。

    假设岛上有N种小吃,每种体积Vi,美味度Wi。

    设某吃货旅行者的食量C,求他能吃到食品的最大美味度。

    输入描述 Input Description

    两个正整数N  C

    N个正整数,Vi

    N个正整数,Wi

    输出描述 Output Description

    最大美味值

    样例输入 Sample Input

    4 10

    2 5 1 9

    10 24 1 100

    样例输出 Sample Output

    101

    数据范围及提示 Data Size & Hint

    N<=100,C<=10000,Vi,Wi<=1000

    可以DP,可以DFS

    背包归类:01背包

    #include<cstdio>
    #include<iostream>
    using namespace std;
    #define N 10100
    int v[N],c[N],f[N],n,m;
    int main(){
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++) scanf("%d",v+i);
        for(int i=1;i<=n;i++) scanf("%d",c+i);
        for(int i=1;i<=n;i++){
            for(int j=m;j>=v[i];j--){
                f[j]=max(f[j],f[j-v[i]]+c[i]);
            }
        }
        printf("%d
    ",f[m]);
        return 0;
    }
  • 相关阅读:
    多线程刷题
    Spring Security的<form>表单的一些细节以及configure(HttpSecurity http)的配置
    Spring Security配置loginPage后,默认的表单登录请求接口也是这个
    一个留了两个星期的bug,基础忘光了
    连接数据库
    反射--笔记(第一篇)
    让图片左右移动
    Java注解
    HTTP协议
    使用servlet连接数据库删除数据
  • 原文地址:https://www.cnblogs.com/shenben/p/5616681.html
Copyright © 2011-2022 走看看