zoukankan      html  css  js  c++  java
  • hdu2844 Coins 多重背包



    #include <cstring>
    #include <string>
    #include <cstdio>
    #include <cmath>
    #include <algorithm>
    #include <vector>
    #include <queue>
    #include <map>
    #define inf 0x3f3f3f3f
    #define ll __int64
    using namespace std;
    
    int n,m,dp[100010],a[100010],c[1010];
    
    void pack01(int cost,int w)
    {
        for(int i=m;i>=cost;i--)
            dp[i]=max(dp[i-cost]+w,dp[i]);
    }
    
    void packall(int cost,int w)
    {
        for(int i=cost;i<=m;i++)
            dp[i]=max(dp[i-cost]+w,dp[i]);
    }
    
    void multipack(int cost,int w,int cnt)
    {
        if(cost*cnt>=m)//体积乘以数量大于整体积。说明不能全然装完,相当于有无穷件。用全然背包
            packall(cost,w);
        else //能够装完,用01背包
        {
            int i=1;
            while(i<cnt)//二进制优化
            {
                pack01(cost*i,w*i);
                cnt-=i;
                i+=i;
            }
            pack01(cost*cnt,w*cnt);
        }
    }
    
    int main()
    {
        int i;
        while(scanf("%d%d",&n,&m)&&(n||m))
        {
            for(i=0;i<n;i++)
                scanf("%d",&a[i]);
            for(i=0;i<n;i++)
                scanf("%d",&c[i]);
            memset(dp,0,sizeof dp);
            for(i=0;i<n;i++)
                multipack(a[i],a[i],c[i]);
    
            int ans=0;
            for(i=1;i<=m;i++)
                if(dp[i]==i) ans++;
            printf("%d
    ",ans);
        }
        return 0;
    }
    


  • 相关阅读:
    第十六周总结
    第十五周学习进度
    输出最长字符串链
    第二阶段冲刺10
    第二阶段冲刺09
    第二阶段冲刺08
    输入法评价
    第十四周进度总结
    collections模块
    shutil模块(了解)
  • 原文地址:https://www.cnblogs.com/wzzkaifa/p/7088871.html
Copyright © 2011-2022 走看看