HDU - 2844 Coins(多重背包+完全背包)

题意

给n个币的价值和其数量,问能组合成\(1-m\)中多少个不同的值。

分析

对\(c[i]*a[i]>=m\)的币,相当于完全背包;\(c[i]*a[i]<m\)的币则是多重背包,考虑用二进制优化解决。最后扫一遍\(dp[i]\)统计答案。

import java.util.*;
import java.math.*;

public class Main{
    static int MAXN = 100005;
    static int []dp =  new int[MAXN];
    static int []a = new int [MAXN];
    static int []c = new int [MAXN];
    static int n,m;
    static void zero(int w,int v) {
        for(int i=m;i>=w;--i) {
            dp[i] = Math.max(dp[i], dp[i-w]+v);
        }
    }

    static void complete(int w,int v) {
        for(int i=w;i<=m;++i) {
            dp[i] = Math.max(dp[i], dp[i-w]+v);
        }
    }

    static void multiple(int w,int v,int c) {
        if(c * w >= m) {
            complete(w,v);
            return;
        }
        int k = 1;
        while(k<=c) {
            zero(k*w,k*v);
            c -= k;
            k <<= 1;
        }
        zero(c*w,c*v);
    }

    public static void main(String []args) {
        Scanner cin =  new Scanner (System.in);
        while(cin.hasNext()) {
            n = cin.nextInt();
            m = cin.nextInt();
            if(n==0 && m==0) break;
            for(int i=0;i<=m;++i) dp[i]=-1;
            dp[0] = 0;

            for(int i=1;i<=n;++i) {
                a[i] = cin.nextInt();
            }
            for(int i=1;i<=n;++i) {
                c[i] = cin.nextInt();
                multiple(a[i],a[i],c[i]);
            }
            int res=0;
            for(int i=1;i<=m;++i) {
                if(dp[i]==i) {
                    res++;
                }
            }
            System.out.println(res);
        }
        cin.close();
    }
}

原文地址:https://www.cnblogs.com/xiuwenli/p/9827669.html

时间: 2024-10-02 06:00:52

HDU - 2844 Coins(多重背包+完全背包)的相关文章

HDU 2844 Coins (多重背包计数 空间换时间)

Coins Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 8999    Accepted Submission(s): 3623 Problem Description Whuacmers use coins.They have coins of value A1,A2,A3...An Silverland dollar. One

HDU 2844 Coins 多重背包(二进制优化)

点击打开链接 Coins Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 8167    Accepted Submission(s): 3327 Problem Description Whuacmers use coins.They have coins of value A1,A2,A3...An Silverland dolla

HDu -2844 Coins多重背包

这道题是典型的多重背包的题目,也是最基础的多重背包的题目 题目大意:给定n和m, 其中n为有多少中钱币, m为背包的容量,让你求出在1 - m 之间有多少种价钱的组合,由于这道题价值和重量相等,所以就是dp[i] = i, 其中dp[i]表示当前背包容量为i 的时候背包能装的价值. 题目思路: 模板 二进制优化 话说那个二进制真的很奇妙,只需要2的1次方 到 2的k-1次方, 到最后在加上一项当前项的个数 - 2 的k次方 + 1,也就是这些系数分别为1; 2; 22 .....2k-1;Mi

hdu 2844 Coins 多重背包模板题 ,二进制优化。据说是楼教主的男人八题之一

Coins Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 8052    Accepted Submission(s): 3291 Problem Description Whuacmers use coins.They have coins of value A1,A2,A3...An Silverland dollar. One

背包系列练习( hdu 2844 Coins &amp;&amp; hdu 2159 &amp;&amp; poj 1170 Shopping Offers &amp;&amp; hdu 3092 Least common multiple &amp;&amp; poj 1015 Jury Compromise)

作为一个oier,以及大学acm党背包是必不可少的一部分.好久没做背包类动规了.久违地练习下-.- dd__engi的背包九讲:http://love-oriented.com/pack/ 鸣谢http://blog.csdn.net/eagle_or_snail/article/details/50987044,这里有大部分比较有趣的dp练手题. hdu 2844 Coins 多重背包 就是一个10w的多重背包,每个物品的cost同时也作为value去做背包,我们求的是每个容量下的价值,所以没

HDU 2844 Coins (组合背包)

题意   给你n种面额不同的金币和每种金币的个数  求这些金币能组合成的面额在m内有多少种 还是明显的背包问题  d[i]表示这些金币在i内能组合成的最大面额  初始化d为负无穷  d[0]=0  这样就可以保证d[i]恰好为i时才能为正值 原因可以自己想想  然后就用背包背吧  直接多重背包也可以过  但是分成多重背包和完全背包要快一点 #include<cstdio> #include<cstring> #include<algorithm> using names

HDU 2844 Coins (动规)

Coins Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 6904    Accepted Submission(s): 2809 Problem Description Whuacmers use coins.They have coins of value A1,A2,A3...An Silverland dollar. One

HDU 2844 Coins

Problem Description Whuacmers use coins.They have coins of value A1,A2,A3...An Silverland dollar. One day Hibix opened purse and found there were some coins. He decided to buy a very nice watch in a nearby shop. He wanted to pay the exact price(witho

HDU 2844 Coins【多重背包】

大意: 有n种物品 告诉你每种物品的价值和数量 问你能拼凑出1--m之内的多少个数 分析: 多重背包 代码: 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 6 const int maxn = 100005; 7 int dp[maxn]; 8 int num[maxn], va[maxn]; 9 int vo[maxn]; 10 int n