zoukankan      html  css  js  c++  java
  • 购物单

    题目描述

    王强今天很开心,公司发给N元的年终奖。王强决定把年终奖用于购物,他把想买的物品分为两类:主件与附件,附件是从属于某个主件的,下表就是一些主件与附件的例子:
    主件 附件
    电脑 打印机,扫描仪
    书柜 图书
    书桌 台灯,文具
    工作椅
    如果要买归类为附件的物品,必须先买该附件所属的主件。每个主件可以有 0 个、 1 个或 2 个附件。附件不再有从属于自己的附件。王强想买的东西很多,为了不超出预算,他把每件物品规定了一个重要度,分为 5 等:用整数 1 ~ 5 表示,第 5 等最重要。他还从因特网上查到了每件物品的价格(都是 10 元的整数倍)。他希望在不超过 N 元(可以等于 N 元)的前提下,使每件物品的价格与重要度的乘积的总和最大。
        设第 j 件物品的价格为 v[j] ,重要度为 w[j] ,共选中了 k 件物品,编号依次为 j 1 , j 2 ,……, j k ,则所求的总和为:
    v[j 1 ]*w[j 1 ]+v[j 2 ]*w[j 2 ]+ … +v[j k ]*w[j k ] 。(其中 * 为乘号)
        请你帮助王强设计一个满足要求的购物单。

    输入描述:

    输入的第 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 是所属主件的编号)


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

    输入例子:
    1000 5
    800 2 0
    400 5 1
    300 5 1
    400 3 0
    500 2 0
    

    输出例子:
    2200
    #include<stdio.h>
     
    int main()
    {
        int M,N;
        int p[60],v[60],m[60],w[60];
        static int dp[3200][60]={0};     //记录最大价值             
        static int flag[3200][60]={0};   //用于标记物品是否放入
        int money,i;
         
        scanf("%d %d",&M,&N);
        for(i=0;i<N;i++)
        {
            scanf("%d %d %d",&p[i],&v[i],&m[i]);
            w[i]=p[i]*v[i];
        }
     
        for(money=0;money<=M/10;money++)
        {
            for(i=0;i<N;i++)
            {
                if((m[i]==0&&flag[money][i]==0)||(m[i]>0&&flag[money][m[i]-1]==1))     //判断是否为主件或者是否为附件且主件已经放入
                {
                    if(p[i]>money*10)                 //判断背包是否能放下
                    {
                        if(i==0)                      //判断是不是第一件物品
                            dp[money][i]=0;
                        else
                            dp[money][i]=dp[money][i-1];
                    }
                    else
                    {
                        if(i==0)
                        {
                            dp[money][i]=w[i];
                            flag[money][i]=1;
                        }
                        else                          //dp            
                        {
                            if(dp[money][i-1]>(dp[money-p[i]/10][i-1]+w[i]))
                            {
                                dp[money][i]=dp[money][i-1];
                            }
                            else
                            {
                                dp[money][i]=dp[money-p[i]/10][i-1]+w[i];
                                flag[money][i]=1;
                            }
                        }
                    }
                }
                else  if(m[i]>0)                      //附件且主件未放入的情况
                {
                    if((p[i]+p[m[i]-1])>money*10)    
                    {
                        if(i==0)                     
                            dp[money][i]=0;
                        else
                            dp[money][i]=dp[money][i-1];
                    }
                    else
                    {
                        if(i==0)
                        {
                            dp[money][i]=w[i]+w[m[i]-1];
                            flag[money][i]=1;         //将附件放入
                            flag[money][m[i]-1]=1;    //对应的主件也需要放入
                        }
                        else                  
                        {
                            if(dp[money][i-1]>(dp[money-p[i]/10-p[m[i]-1]/10][i-1]+w[i]+w[m[i]-1]))
                            {
                                dp[money][i]=dp[money][i-1];
                            }
                            else
                            {
                                dp[money][i]=dp[money-p[i]/10-p[m[i]-1]/10][i-1]+w[i]+w[m[i]-1];
                                flag[money][i]=1;
                                flag[money][m[i]-1]=1;
                            }
                        }
                    }
                }
                else                                   //主件已经放入的情况
                    dp[money][i]=dp[money][i-1];
     
            }
        }
     
        printf("%d",dp[M/10][N-1]);
     
        return 0;
    }
  • 相关阅读:
    关于Date相关函数在火狐Firefox和谷歌Chrome下的不同
    一键部署 LNMP 建站环境
    Python 返回值、方法和函数的区别
    Python中万物皆对象?的理解
    Python 实用小工具 练习(2)
    Chrome浏览器F12开发者工具使用教程博客汇总
    觅风易语言[21-24、30]
    觅风易语言[1-10]
    觅风易语言[11-20]
    Python Byte类型(API系列)
  • 原文地址:https://www.cnblogs.com/LinKArftc/p/5766933.html
Copyright © 2011-2022 走看看