zoukankan      html  css  js  c++  java
  • hdu 2191 珍惜现在,感恩生活(多重背包)

    题意:

    有N元经费,M种大米,每种大米有单袋价格p元,单袋重量h,以及对应袋数c。

    问最多可以买多重的大米。

    思路:

    经典多重背包,用二进制的方法。

    看代码

    代码:

    struct node{
        int price,weight,num;
    }
    obj[105];
    
    int dp[105];
    int n,m;
    
    
    void MultiplePack(int cost,int value,int amount){
        if(cost*amount>=n){
            rep(i,cost,n) dp[i]=max( dp[i],dp[i-cost]+value );
            return;
        }
        int k=1;
        while(k<amount){
            rep2(i,n,k*cost) dp[i]=max( dp[i],dp[i-k*cost]+k*value );
            amount -= k;
            k *= 2;
        }
        rep2(i,n,amount*cost) dp[i]=max( dp[i],dp[i-amount*cost]+amount*value );
    }
    
    int main(){
    
        int T;
        cin>>T;
        while(T--){
            cin>>n>>m;
            rep(i,1,m)
                cin>>obj[i].price>>obj[i].weight>>obj[i].num;
    
            mem(dp,0);
    
            rep(i,1,m){
                MultiplePack(obj[i].price,obj[i].weight,obj[i].num);
            }
    
            cout<<dp[n]<<endl;
        }
    
        return 0;
    }
  • 相关阅读:
    翻转数组
    C语言之指针
    C语言之结构体
    C语言之函数
    数据结构之typedef
    数据结构之树
    数据结构之链表
    数据结构之队列
    数据结构之数组
    ssh远程连接控制 linux 口令、密钥连接
  • 原文地址:https://www.cnblogs.com/fish7/p/4245075.html
Copyright © 2011-2022 走看看