hdu2844Coins(多重背包模板)

Coins

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

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

多重背包的模板题

 1 #include <iostream>
 2 #include <map>
 3 #include <math.h>
 4 #include <algorithm>
 5 #include <vector>
 6 #include <cstdlib>
 7 #include <cstdio>
 8 #include <cstring>
 9 #include <set>
10 using namespace std;
11 int n,m,a[105],c[105],dp[100005];
12 void comdp(int w,int v)
13 {
14     int i;
15     for(i=w; i<=m; i++)
16         dp[i]=max(dp[i],dp[i-w]+v);
17 }
18 void zeroone(int w,int v)
19 {
20     int i;
21     for(i=m; i>=w; i--)
22         dp[i]=max(dp[i],dp[i-w]+v);
23 }
24 void multidp(int w,int v,int cnt)//此时开始多重背包,dp[i]表示背包中重量为i时所包含的最大价值
25 {
26     if(cnt*w>=m)//此时相当于物品数量无限进行完全背包
27     {
28         comdp(w,v);
29         return;
30     }
31     int k=1;//否则进行01背包转化,具体由代码下数学定理可得
32     while(k<=cnt)
33     {
34         zeroone(k*w,k*v);
35         cnt-=k;
36         k*=2;
37     }
38     zeroone(cnt*w,cnt*v);
39     return ;
40 }
41 int main()
42 {
43     while(~scanf("%d %d",&n,&m))
44     {
45         if(n==0&&m==0)break;
46         for(int i=1;i<=n;i++)scanf("%d",&a[i]);
47         for(int i=1;i<=n;i++)scanf("%d",&c[i]);
48         memset(dp,0,sizeof(dp));
49         int ans=0;
50         for(int i=1;i<=n;i++)
51         {
52             multidp(a[i],a[i],c[i]);
53         }
54         for(int i=1;i<=m;i++)
55         {
56             if(dp[i]==i)ans++;
57         }
58         printf("%d\n",ans);
59     }
60     return 0;
61 }

原文地址:https://www.cnblogs.com/fqfzs/p/10159209.html

时间: 2024-11-05 21:53:39

hdu2844Coins(多重背包模板)的相关文章

多重背包模板

/** * 多重背包: * 有N种物品和一个容量为V的背包.第i种物品最多有Mi件可用, * 每件耗费的空间是Ci,价值是Wi. * 求解将哪些物品装入背包可使这些物品的耗费的空间总和不超过背包容量,且价值总和最大. */ #include <stdio.h> #include <string.h> int max(int a, int b){ if (a > b)return a; return b; } #define maxn 100005 int c[maxn], w

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

hdu2844 多重背包模板

01 背包 有n 种不同的物品,每个物品有两个属性,size 体积,value 价值,现在给一个容量为 w 的背包,问最多可带走多少价值的物品. int f[w+1]; //f[x] 表示背包容量为x 时的最大价值 for (int i=0; i<n; i++) for (int j=w; j>=size[i]; j--) f[j] = max(f[j], f[j-size[i]]+value[i]); //逆序 完全背包 如果物品不计件数,就是每个物品有无数件的话,稍微改下即可 for (i

解题报告:hdu2191汶川地震 - 多重背包模板

2017-09-03 17:01:36 writer:pprp 这是一道多重背包裸题 - 记得是从右向左进行,还有几点需要注意啊,都在代码中表示出来了 代码如下: /* @theme:hdu2191 汶川地震 @writer:pprp @begin:16:25 @end:16:59 @declare:多重背包问题 @error:方向是从左向右进行 @date:2017/9/3 */ #include <bits/stdc++.h> using namespace std; int M, N;/

hpu 2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 【多重背包模板】

悼念512汶川大地震遇难同胞--珍惜现在,感恩生活 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 19561    Accepted Submission(s): 8280 Problem Description 急!灾区的食物依然短缺! 为了挽救灾区同胞的生命,心系灾区同胞的你准备自己采购一些粮食支援灾区,现在假设你一共有资金n元,

01、完全、多重背包模板

背包问题: 背包总容量为W,有n件重量为weight[i],权值为value[i]的物品 1.01背包: 这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放. 1 void ZeroOnePack (int weight,int value) 2 { 3 for (int w = W; w >= weight; w--) 4 dp[w] = max(dp[w - weight] + value, dp[w]); 5 } 2.完全背包: 每件物品有无限多个. void Complet

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

[51nod]多重背包模板

https://www.51nod.com/tutorial/course.html#!courseId=11 题目大意: 有$N$种物品和一个容量为$W$的背包.第$i$种物品最多有$c[i]$件可用,每件体积是$w[i]$,价值是$v[i]$.求解将哪些物品装 入背包可使这些物品的费用总和不超过背包容量,且价值总和最大. 解题思路:采用二进制拆分的思想,将有限的背包划分为01背包和完全背包解决. 转移方程:$dp[i][j] = \max \{ dp[i - 1][v - k*w[i]] +

【多重背包模板】poj 1014

#include <iostream> #include <stdio.h> #include <cstring> #define INF 100000000 using namespace std; int f[240005]; //f[j]相当于f[i][j]: 考虑1...i个物品,恰好放到容量为j,所能达到的最大价值 int v; //背包容量 void complete_pack(int *dp, int c, int w) { for(int i = c;