zoukankan      html  css  js  c++  java
  • Luogu 1064 金明的预算方案 / CJOJ 1352 [NOIP2006] 金明的预算方案(动态规划)

    Luogu 1064 金明的预算方案 / CJOJ 1352 [NOIP2006] 金明的预算方案(动态规划)

    Description

    金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间。更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就行”。今天一早,金明就开始做预算了,他把想买的物品分为两类:主件与附件,附件是从属于某个主件的,下表就是一些主件与附件的例子:

    主件 附件

    电脑 打印机,扫描仪

    书柜 图书

    书桌 台灯,文具

    工作椅 无

    如果要买归类为附件的物品,必须先买该附件所属的主件。每个主件可以有0个、1个或2个附件。附件不再有从属于自己的附件。金明想买的东西很多,肯定会超过妈妈限定的N元。于是,他把每件物品规定了一个重要度,分为5等:用整数1~5表示,第5等最重要。他还从因特网上查到了每件物品的价格(都是10元的整数倍)。他希望在不超过N元(可以等于N元)的前提下,使每件物品的价格与重要度的乘积的总和最大。

    设第j件物品的价格为v[j],重要度为w[j],共选中了k件物品,编号依次为j1,j2,……,jk,则所求的总和为:

    v[j1]*w[j1]+v[j2]*w[j2]+ …+v[jk]*w[jk]。(其中*为乘号)

    请你帮助金明设计一个满足要求的购物单。

    Input

    输入的第1行,为两个正整数,用一个空格隔开:

    N m (其中N(<32000)表示总钱数,m(<60)为希望购买物品的个数。)

    从第2行到第m+1行,第j行给出了编号为j-1的物品的基本数据,每行有3个非负整数

    v p q (其中v表示该物品的价格(v<10000),p表示该物品的重要度(1~5),q表示该物品是主件还是附件。如果q=0,表示该物品为主件,如果q>0,表示该物品为附件,q是所属主件的编号)

    Output

    输出只有一个正整数,为不超过总钱数的物品的价格与重要度乘积的总和的最大值(<200000)。

    Sample Input

    1000 5
    800 2 0
    400 5 1
    300 5 1
    400 3 0
    500 2 0

    Sample Output

    2200

    Http

    Luogu:https://www.luogu.org/problem/show?pid=1064#sub
    CJOJ:http://oj.changjun.com.cn/problem/detail/pid/1352

    Source

    动态规划

    题目大意

    依赖背包

    解决思路

    我们将主件与附件合在一起看作一组,设F[i][j]表示前i组花费j元钱的最大价值,每次枚举只选主件、主件+附件1、主件+附件2、主件+附件1+附件这三种情况,即可按照普通的背包问题解决。

    代码

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    using namespace std;
    
    class Item
    {
    public:
        int value,cost;
        Item()
        {
            value=cost=-1;//-1的时候表示还没有这个物品
        }
        void init(int a,int b)
        {
            value=a;
            cost=b;
        }
    };
    
    class MainItem
    {
    public:
        Item Main;//主件
        Item A[3];//附近
    };
    
    const int maxN=33000;
    const int maxM=70;
    const int inf=2147483647;
    
    int n,m;
    int Map[maxM];
    MainItem I[maxM];
    int F[maxM][maxN];
    
    int main()
    {
        int N=0;
        cin>>n>>m;
        for (int i=1;i<=m;i++)
        {
            int v,p,q;
            cin>>v>>p>>q;
            if (q==0)
            {
                N++;
                Map[i]=N;
                I[N].Main.init(v*p,v);
            }
            else
            {
                int vv=Map[q];
                if (I[vv].A[1].value==-1)
                    I[vv].A[1].init(v*p,v);
                else
                    I[vv].A[2].init(v*p,v);
            }
        }
        memset(F,0,sizeof(F));
        int Ans=0;
        for (int i=1;i<=N;i++)
            for (int j=0;j<=n;j++)
            {
                F[i][j]=F[i-1][j];
                int c=I[i].Main.cost;
                int v=I[i].Main.value;
                int c1=I[i].A[1].cost;
                int c2=I[i].A[2].cost;
                int v1=I[i].A[1].value;
                int v2=I[i].A[2].value;
                if (j>=c)//注意要判断是否合法,因为可能出现没有附件或附件只有一个的情况
                {
                    F[i][j]=max(F[i][j],F[i-1][j-c]+v);
                }
                if ((v1!=-1)&&(j>=c1+c))
                    F[i][j]=max(F[i][j],F[i-1][j-c1-c]+v+v1);
                if ((v2!=-1))
                {
                    if (j>=c2+c)
                        F[i][j]=max(F[i][j],F[i-1][j-c2-c]+v+v2);
                    if (j>=c+c1+c2)
                        F[i][j]=max(F[i][j],F[i-1][j-c-c1-c2]+v+v1+v2);
                }
                Ans=max(Ans,F[i][j]);
            }
        /*for (int i=1;i<=N;i++)
        {
            for (int j=0;j<=n;j++)
                cout<<F[i][j]<<' ';
            cout<<endl;
        }*/
        cout<<Ans<<endl;
        return 0;
    }
    
  • 相关阅读:
    《C# to IL》第一章 IL入门
    multiple users to one ec2 instance setup
    Route53 health check与 Cloudwatch alarm 没法绑定
    rsync aws ec2 pem
    通过jvm 查看死锁
    wait, notify 使用清晰讲解
    for aws associate exam
    docker 容器不能联网
    本地运行aws lambda credential 配置 (missing credential config error)
    Cannot connect to the Docker daemon. Is 'docker daemon' running on this host?
  • 原文地址:https://www.cnblogs.com/SYCstudio/p/7152682.html
Copyright © 2011-2022 走看看