zoukankan      html  css  js  c++  java
  • TOJ3540Consumer(有依赖的背包)

    http://acm.tju.edu.cn/toj/showp3540.html
    3540.   Consumer
    Time Limit: 2.0 Seconds   Memory Limit: 65536K
    Total Runs: 136   Accepted Runs: 67



    FJ is going to do some shopping, and before that, he needs some boxes to carry the different kinds of stuff he is going to buy. Each box is assigned to carry some specific kinds of stuff (that is to say, if he is going to buy one of these stuff, he has to buy the box beforehand). Each kind of stuff has its own value. Now FJ only has an amount of W dollars for shopping, he intends to get the highest value with the money.

    Input

    The first line will contain two integers, n(the number of boxes 1 ≤ n ≤ 50), w (the amount of money FJ has, 1 ≤ w ≤ 100000) Then n lines follow. Each line contains the following number pi (the price of the ith box 1 ≤ pi ≤ 1000), mi (1 ≤ mi ≤ 10 the number goods i-th box can carry), and mi pairs of numbers, the price cj (1 ≤ cj ≤ 100), the value vj (1 ≤ vj ≤ 1000000).

    Output

    For each test case, output the maximum value FJ can get

    Sample Input

    3 800
    300 2 30 50 25 80
    600 1 50 130
    400 3 40 70 30 40 35 60
    

    Sample Output

    210

     【题目大意】给若干组物品,每组物品都有一个箱子(箱子自身也有cost),然后就是物品的cost和value,要买某个物品必须也要买装这个物品的箱子,给一定钱数,问能获得的最大价值。

    解题思路:对每个箱子的附件进行一次01背包,背包的容量是总花费-箱子的花费,得到的就是对应每个附件的最大价值;然后再对这个箱子进行一次01背包,箱子的价值dpbox[i-p]与不取这个箱子的价值dptotal[i]那个大取哪个,模模糊糊知道大体思路

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <algorithm>
     5 using namespace std;
     6 const int MAX = 100000 + 10;
     7 int dptotal[MAX],dpbox[MAX];
     8 int price,value,n,w,p,c,m;
     9 int main()
    10 {
    11     while(scanf("%d%d", &n,&w) != EOF)
    12     {
    13         memset(dptotal, 0, sizeof(dptotal));
    14         for(int i = 0; i < n; i++)
    15         {
    16             scanf("%d%d",&p,&m);
    17             memcpy(dpbox, dptotal, sizeof(dptotal));
    18             for(int k = 1; k <= m; k++)
    19             {
    20                 scanf("%d%d",&price,&value);
    21 
    22                 for(int j = w - p; j >= price; j--)
    23                 {
    24                     dpbox[j] = max(dpbox[j], dpbox[j - price] + value);
    25                 }
    26             }
    27             for(int k = w; k >= p; k--)
    28             {
    29                 if(dptotal[k] < dpbox[k - p])
    30                     dptotal[k] = dpbox[k - p];
    31             }
    32         }
    33         printf("%d
    ",dptotal[w]);
    34     }
    35     return 0;
    36 }
    View Code

     

  • 相关阅读:
    【C语言天天练(三)】typedef具体解释
    操作系统之基本分页存储管理方式
    线索二叉树创建及删除
    SVN:This client is too old to work with working copy…解决的方法
    android4.2 telephone应用层分析
    JPA学习笔记(3)——JPA注解
    Android研发中对String的思考(源代码分析)
    《Effective Modern C++》翻译--条款2: 理解auto自己主动类型推导
    “2014年CityEngine三维建模与设计精英培训班”——全国巡回举办
    Git命令总结
  • 原文地址:https://www.cnblogs.com/zhaopAC/p/5058057.html
Copyright © 2011-2022 走看看