zoukankan      html  css  js  c++  java
  • hdu-2844(完全背包+二进制优化模板)

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

    思路:问1-m能的得到的硬币的值,所以dp[i]==i即可。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    int dp[100050],a[120],c[120],n,m;
    void zerof(int cost,int val)
    {
        for(int i=m;i>=cost;i--)
        dp[i]=max(dp[i],dp[i-cost]+val);
    }
    void completf(int cost,int val)
    {
        for(int i=cost;i<=m;i++)
        dp[i]=max(dp[i],dp[i-cost]+val);
    }
    void mul(int cost,int val,int num)
    {
        if(cost*num>=m) completf(cost,val);
        else
        {
            for(int i=1;i<=num;i*=2)
            {
                zerof(i*cost,i*val);
                num-=i;
            }
            zerof(num*cost,num*val);
        }
    }
    int main(void)
    {
        int i,j,ans;
        while(cin>>n>>m&&(n+m))
        {
            memset(dp,0,sizeof(dp));
            for(i=0;i<n;i++) cin>>a[i];
            for(i=0;i<n;i++) cin>>c[i];
            for(i=0;i<n;i++) mul(a[i],a[i],c[i]);
            ans=0;
            for(i=1;i<=m;i++)
            ans+=(dp[i]==i?1:0);
            cout<<ans<<endl;
         }
        return 0;
    } 
    View Code
  • 相关阅读:
    愚人节的礼物
    Image Transformation
    Rails
    Google Map
    Code Formatter
    ACboy needs your help again!
    Geek's Collection(幂运算)
    Train Problem I
    Beautiful Meadow
    Card Trick(模拟)
  • 原文地址:https://www.cnblogs.com/2018zxy/p/9837632.html
Copyright © 2011-2022 走看看