hdu 2844 多重背包coins

http://acm.hdu.edu.cn/showproblem.php?pid=2844


New~ 欢迎“热爱编程”的高考少年——报考杭州电子科技大学计算机学院
关于2015年杭电ACM暑期集训队的选拔

Coins

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 8909    Accepted Submission(s): 3580

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

Source

2009 Multi-University Training Contest 3 - Host by WHU

Recommend

gaojie   |   We have carefully selected several similar problems for you:  2159 2602 1203 1171 2845

Statistic | Submit | Discuss | Note

 1 /*
 2 P03: 多重背包问题
 3 题目
 4 有N种物品和一个容量为V的背包。第i种物品最多有n[i]件可用,每件费用是c[i],价值是w[i]。
 5 求解将哪些物品装入背包可使这些物品的费用
 6 总和不超过背包容量,且价值总和最大。
 7 基本算法
 8 这题目和完全背包问题很类似。基本的方程只需将完全背包问题的方程略微一改即可,因为对
 9 于第i种物品有n[i]+1种策略:取0件,
10 取1件……取n[i]件。令f[i][v]表示前i种物品恰放入一个容量为v的背包的最大权值,则有状态
11 转移方程:
12 f[i][v]=max{f[i-1][v-k*c[i]]+k*w[i]|0<=k<=n[i]}
13 复杂度是O(V*Σn[i])。
14 */
15 #include <string.h>
16 #include <stdio.h>
17 int main()
18 {
19     int n,m,A[101],C[101],f[100001],num,count,i,j,k;
20     while(scanf("%d%d",&n,&m),n,m)
21     {
22         for( i = 0; i < n ; i++)
23         scanf("%d",&A[i]);
24         for( i = 0; i < n ; i++)
25         scanf("%d",&C[i]);
26         memset(f,0,sizeof(f));//标记如果能组成m这种面值的f[m]为1,否则为0。
27         f[0] = 1;
28         for( i = 0; i < n ; i++)
29         for( j = 0;j < A[i];j++)//针对每种硬币,只能组成由面值为0--A[i]-1与K*A[i]的加和组成。1<=k<=c[i]
30         {
31             count = C[i]; //记录使用的次数
32             for( k = j+A[i] ; k <= m;k+=A[i])//
33             if(f[k]==1)count = C[i];//如果这种面值的价格不用A[i]这种硬币即可组成,那么这种硬币的数量可以恢复原始数量即一次也没用过
34             else if(count>0&&f[k-A[i]]==1)
35             {
36                 f[k] = 1;
37                 count--;
38             }
39         }
40         num = 0;//记录数目,得到可以组成的金额数目。
41         for( i = 1; i <= m; i++)
42         if(f[i]==1)num++;
43         printf("%d\n",num);
44     }
45     return 0;
46 }
时间: 2024-10-03 04:49:44

hdu 2844 多重背包coins的相关文章

Coins(hdu 2844 多重背包)

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

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

hdu 2844 poj 1742 Coins

hdu 2844 poj 1742 Coins 题目相同,但是时限不同,原本上面的多重背包我初始化为0,f[0] = 1;用位或进行优化,f[i]=1表示可以兑成i,0表示不能. 在poj上运行时间正好为时限3000ms....太慢了,hdu直接TLE(时限1s); 之 后发现其实并不是算法的问题,而是库函数的效率没有关注到.我是使用fill()按量初始化的,但是由于memset()可能是系统底层使用了四个字节拷 贝的函数(远比循环初始化快),效率要高得多..这就是为什么一直TLE的原因,fil

hdu 1171 Big Event in HDU(母函数|多重背包)

http://acm.hdu.edu.cn/showproblem.php?pid=1171 题意:有n种物品,给出每种物品的价值和数目,要将这些物品尽可能的分成相等的两份A和B且A>=B ,输出A,B. 母函数可以过,但感觉最直接的方法应该是多重背包. 母函数的话,也是按总价值的一半求,从一半到小枚举,直到找到系数不为0的就是B. #include <stdio.h> #include <iostream> #include <map> #include <

HDU 1059 多重背包+二进制优化

Dividing Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 16909    Accepted Submission(s): 4729 Problem Description Marsha and Bill own a collection of marbles. They want to split the collection

hdu 5445 多重背包

Food Problem Time Limit: 3000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 1243    Accepted Submission(s): 368 Problem Description Few days before a game of orienteering, Bell came to a mathematician to sol

hdu 2844 混合背包【背包dp】

http://acm.hdu.edu.cn/showproblem.php?pid=2844 题意:有n种纸币面额(a1,a2,...an),每种面额对应有(c1,c2,...cn)张.问这些钱能拼成1-m中多少种值. 题解:背包dp问题.若ci=1,是01背包,若ci*ai>=m则是完全背包,否则是多重背包.(详见<背包九讲>) 先复习一下三种简单背包形式: 01背包(F[v] ← max{F[v], F[v ?Ci] +Wi} ): 完全背包(F[i, v] = max(F[i ?

HDU1171--Big Event in HDU(多重背包)

Big Event in HDU   Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 1139 Accepted Submission(s): 444 Problem Description Nowadays, we all know that Computer College is the biggest department in HD

hdu 1059 (多重背包) Dividing

这里;http://acm.hdu.edu.cn/showproblem.php?pid=1059 题意是有价值分别为1,2,3,4,5,6的商品各若干个,给出每种商品的数量,问是否能够分成价值相等的两份. 联想到多重背包,稍微用二进制优化一下.(最近身体不适,压力山大啊) 1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #define inf 70000 5 using namespace s