zoukankan      html  css  js  c++  java
  • hdu 2844 coins

    题目看了比较长时间,最后发现是给你一些硬币,问你可以组成几个不同1~m之间的数。
    我是用将物品用二进制优化的方法转变成01背包来求解。

    #include<string.h>
    #include<algorithm>
    using namespace std;
    
    int main()
    {
        int i,j,n,m,dp[100000+5],a[100+5],b[100+5],val[10000],ans;
        while(~scanf("%d%d",&n,&m))
        {
            if(n==0&&m==0) break;
            for(i=0;i<n;i++)
                scanf("%d",&a[i]);
            for(i=0;i<n;i++)
                scanf("%d",&b[i]);
            for(i=0,j=0;i<n;i++)
            {
                int k=1;
                while(k<b[i])
                {
                    val[j++]=k*a[i];
                    b[i]-=k;
                    k*=2;
                }
                val[j++]=a[i]*b[i];
            }
            memset(dp,0,sizeof(dp));
    
            int k=j;
            dp[0]=1;
            for(i=0;i<k;i++)
            {
                for(j=m;j>=val[i];j--)
                {
                    if(dp[j-val[i]]) dp[j]=1;
                }
    
            }
            ans=0;
            for(i=1;i<=m;i++)
            {
                ans+=dp[i];
            }
            printf("%d
    ",ans);
        }
        return 0;
    }
    

    版权声明:本文为博主原创文章,未经博主允许不得转载。http://xiang578.top/

  • 相关阅读:
    小学期实践2
    小学期实践小组心得
    小学期实践1
    《构建之法》8
    《构建之法》7
    《构建之法》6
    《构建之法》5
    《构建之法》4
    《构建之法》3
    lintcode
  • 原文地址:https://www.cnblogs.com/xryz/p/4847935.html
Copyright © 2011-2022 走看看