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 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(without
change) and he known the price would not more than m.But he didn‘t know the exact price of the watch.

You are to write a program which reads n,m,A1,A2,A3...An and C1,C2,C3...Cn corresponding to the number of Tony‘s coins of value A1,A2,A3...An then calculate how many prices(form 1 to m) Tony can pay use these coins.

Input

The input contains several test cases. The first line of each test case contains two integers n(1 ≤ n ≤ 100),m(m ≤ 100000).The second line contains 2n integers, denoting A1,A2,A3...An,C1,C2,C3...Cn (1 ≤ Ai ≤ 100000,1 ≤ Ci ≤ 1000).
The last test case is followed by two zeros.

Output

For each test case output the answer on a single line.

Sample Input

3 10
1 2 4 2 1 1
2 5
1 4 2 1
0 0

Sample Output

8
4

最近一直在做DP的题目,,都是一些模板题,,现在已成了背包九讲作者的死忠了。如果我是女的,,我一定要嫁给写出背包九讲的男人o(╯□╰)o

先说一下二进制优化的原理:

1、2、4可以组合出所有小于8的数;

1、2、4、8可以组合出所有小于16的数;

1、2、4、8、16可以组合出所有小于32的数;

我的代码:

#include <stdio.h>
#include <string.h>
#define M 100100
#define N 110

int a[N] , c[N] , dp[M] ;

void zeroOnePack(int value , int m)
{
	for(int i = m ; i >= value ; --i)
	{
		if(dp[i]<dp[i-value]+value)
		{
			dp[i] = dp[i-value]+value ;
		}
	}
}

void completePack(int value , int m)
{
	for(int i = value ; i <= m ; ++i)
	{
		if(dp[i]<dp[i-value]+value)
		{
			dp[i] = dp[i-value]+value ;
		}
	}
}

void multiplePack(int value , int count , int total)
{
	if(value*count>total)
	{
		completePack(value , total) ;
	}
	else
	{
		int k = 1 ;
		while(k<=count)
		{
			zeroOnePack(k*value , total) ;
			count -= k ;
			k = 2*k ;
		}
		zeroOnePack(count*value,total) ;
	}
}

int main()
{
	int n ,m ;
	while(~scanf("%d%d",&n,&m) && (n||m))
	{
		for(int i = 0 ; i < n ; ++i)
		{
			scanf("%d",&a[i]);
		}
		for(int i = 0 ; i < n ; ++i)
		{
			scanf("%d",&c[i]);
		}

		memset(dp,0,sizeof(dp)) ;

		for(int i = 0 ; i < n ; ++i)
		{
			multiplePack(a[i],c[i],m);
		}
		int ans = 0 ;
		for(int i = 1 ; i <= m ; ++i)
		{
			if(i == dp[i])
			{
				++ans ;
			}
		}
		printf("%d\n",ans) ;
	}
	return 0 ;
}
时间: 2024-10-11 12:34:43

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

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(多重背包+完全背包)

题意 给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 i

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 (组合背包)

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

HDU2844_Coins【多重背包】【二进制优化】

Coins Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 7497    Accepted Submission(s): 3055 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 多重背包模板

给出n个数和m 每个数给出出现次数和价值,问任意组合组成不大于M的价值,共能产生多少个数 多重背包的的二进制优化写法  模板mark一下 二进制优化原理: 1.2.4可以组合出所有小于8的数: 1.2.4.8可以组合出所有小于16的数: 1.2.4.8.16可以组合出所有小于32的数: -- #include "stdio.h" #include "string.h" int n,m; int dp[100010]; void complete_pack(int v

LCT男人八题系列

楼教的男人八题名气甚大,今天做了一道感觉还是涨了不少姿势的,然而估计之后的每道题都要看题解吧,姑且先记录一下.以后再做再更 1737 Connected Graph 1100 [email protected] 1738 An old Stone Game 407 [email protected] 1739 Tony's Tour 671 [email protected] 1740 A New Stone Game 2240 [email protected] 1741 Tree 1728