zoukankan      html  css  js  c++  java
  • hdu 2191(多重背包)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2191

    这完全就是多重背包的应用啊,刚看了背包九讲。。。orz,直接按着上面的伪代码敲的。。。

    View Code
     1 #include<iostream>
     2 const int N=110;
     3 using namespace std;
     4 int n,m;
     5 
     6 struct Rice{
     7     int price;
     8     int weight;
     9     int number;
    10 }rice[N];
    11 int dp[N];
    12 //完全背包
    13 void CompletePack(int cost,int weight){
    14     for(int i=cost;i<=n;i++){
    15         dp[i]=max(dp[i],dp[i-cost]+weight);
    16     }
    17 }
    18 //01背包
    19 void ZeroOnePack(int cost,int weight){
    20     for(int i=n;i-cost>=0;i--){
    21         dp[i]=max(dp[i],dp[i-cost]+weight);
    22     }
    23 }
    24 
    25 //多重背包
    26 void MultiplePack(int cost,int weight,int number){
    27     //如果大于等于金额,就按完全背包处理(此时相当于不限定袋数)
    28     if(cost*number>=n){
    29         CompletePack(cost,weight);
    30         return ;
    31     }
    32     int k=1;
    33     while(k<number){
    34         ZeroOnePack(k*cost,k*weight);
    35         number-=k;
    36         k*=2;
    37     }
    38     ZeroOnePack(number*cost,number*weight);
    39 }
    40 
    41 int main(){
    42     int _case;
    43     scanf("%d",&_case);
    44     while(_case--){
    45         scanf("%d%d",&n,&m);
    46         memset(dp,0,sizeof(dp));
    47         for(int i=0;i<m;i++){
    48             scanf("%d%d%d",&rice[i].price,&rice[i].weight,&rice[i].number);
    49         }
    50         for(int i=0;i<m;i++){
    51             MultiplePack(rice[i].price,rice[i].weight,rice[i].number);
    52         }
    53         printf("%d\n",dp[n]);
    54     }
    55     return 0;
    56 }
  • 相关阅读:
    wenbao与分治
    wenbao与贪心
    wenbao与高精度
    wenbao与FFT
    wenbao与卡特兰数
    wenbao与类
    wenbao与取整函数
    wenbao与字符串转化
    wenbao与scanf
    wenbao与数字与字符串
  • 原文地址:https://www.cnblogs.com/wally/p/2956605.html
Copyright © 2011-2022 走看看