zoukankan      html  css  js  c++  java
  • HDOJ(HDU).2844 Coins (DP 多重背包+二进制优化)

    HDOJ(HDU).2844 Coins (DP 多重背包+二进制优化)

    题意分析

    先把每种硬币按照二进制拆分好,然后做01背包即可。需要注意的是本题只需要求解可以凑出几种金钱的价格,而不需要输出种数。因此用0表示不可以,1表示可以。最后对dp数组扫描一遍即可。

    代码总览

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #define nmax 100000
    #define nn 105
    #define INIT(x,y) memset(x,y,sizeof(x))
    using namespace std;
    int a[nn],c[nn];
    int pri[nmax],num[nmax],dp[nmax];
    int main()
    {
        //freopen("in.txt","r",stdin);
        int n,m;
        while(scanf("%d%d",&n,&m) && n){
            INIT(dp,0);
            INIT(a,0);INIT(c,0); INIT(pri,0);INIT(num,0);
            for(int i = 1; i<=n;++i) scanf("%d",&a[i]);
            for(int i = 1; i<=n;++i) scanf("%d",&c[i]);
            int cnt = 0;
            for(int k =1 ;k<=n ;++k){
                for(int i =1; i<=c[k];i*=2){
                    pri[cnt] = i * a[k];
                    num[cnt++] = i * 1;
                    c[k]-=i;
                }
                if(c[k]>0){
                    pri[cnt] = c[k] * a[k];
                    num[cnt++] = c[k];
                }
            }
            dp[0] = 1;
            for(int i = 0; i<=cnt;++i){
                for(int j = m; j>=pri[i]; --j){
                    //dp[j] = max(dp[j],dp[j-pri[i]]+1);
                    if(dp[j-pri[i]]) dp[j]  =1;
                }
    //            for(int i =0;i<=m;++i) printf(" %3d",dp[i]);
    //            printf("
    ");
            }
    //        for(int i =1;i<=m;++i) printf(" %3d",i);
    //        printf("
    ");
    //
    //        printf("%d
    ");
            int ans = 0;
            for(int i = 1;i<=m;++i)
                if(dp[i] == 1) ans++;
            printf("%d
    ",ans);
    
        }
        return 0;
    }
  • 相关阅读:
    关于排列组合与分配问题
    Stirling数
    UVA 294 求约数的个数
    Linux中profile与bashrc的作用
    一致性哈希(consistent hashing)算法
    TCP三次握手与四次挥手
    MySQL查询昨天、今天、7天、近30天、本月、上一月数据
    java基础-注解Annotation原理和用法
    java基础-浅复制与深复制的理解
    Linux命令行提示符设置
  • 原文地址:https://www.cnblogs.com/pengwill/p/7367143.html
Copyright © 2011-2022 走看看