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
还有R和U的总结就不写了;总结基本都包括在下面了;
题意:给你n种硬币的数量和价值,让你求组成小于等于m钱数的组成方案数;
解题思路:第一遍写超时了,本来想不写了的,赶紧写ACM-steps,过了好长时间上课老师讲了二进制优化才,才有了思路,这里需要解释一下二进制优化:任何一个数都可以用二进制数+非二进制数来表示,比如10可以表示为1+2+4+3;利用这一个原理将双重循环的背包转化为单重循环的01背包问题,这样可以大大的节省时间;在状态转移的过程中需要做一个判断,当前钱的总价值是不是超过要求钱数,超过了,就是一个完全背包问题,没超过就可以转化为01背包问题;dp[i]表示不超过i钱数的能凑出来最大钱数,最后只要dp[i]==i;就是一种方案;
感悟:背包问题需要时间来理解。时间越长有的东西理解的越深刻啊;
代码:
#include

#define N 20010

using namespace std;

int v[N],dp[N*100],w[N],n,m;

void zero_onebag(int v)//01背包

{

    for(int
i=m;i>=v;i--)

       
dp[i]=max(dp[i],dp[i-v]+v);

}

void complet_bag(int v)//完全背包

{

    for(int
i=v;i<=m;i++)

       
dp[i]=max(dp[i],dp[i-v]+v);

}

void multiply_bag(int v,int k)//多重背包

{

   
if(k*v>=m)

    {

       
complet_bag(v);

       
return ;

    }

    int
d=1;

   
while(d

    {

       
zero_onebag(d*v);

           
k-=d;

       
d<<=1;

    }

   
zero_onebag(k*v);

}

int main()

{

   
//freopen("in.txt", "r", stdin);

   
while(scanf("%d %d",&n,&m)!=EOF)

    {

       
if(n==0&&m==0)

           
break;

       
//cout<<n<<" "<<m<<endl;

       
for(int i=0;i

           
scanf("%d",&v[i]);

       
for(int i=0;i

           
scanf("%d",&w[i]);

       
memset(dp,0,sizeof dp);

       
for(int i=0;i

           
multiply_bag(v[i],w[i]);

       
int ans=0;

       
//for(int i=1;i<=m;i++)

       
//   
cout<<dp[i]<<" ";

       
//cout<<endl;

       
for(int i=1;i<=m;i++)

           
if(dp[i]==i)

           
ans++;

       
printf("%d\n",ans);

    }

    return
0;

}

Coins(多重背包+二进制优化)的更多相关文章

  1. hdu2844 Coins -----多重背包+二进制优化

    题目意思:给出你n种硬币的面额和数量,询问它能够组合成1~m元中的几种情况. 这题如果直接按照完全背包来写的话,会因为每一种硬币的数目1 ≤ Ci ≤ 1000而超时,所以这里需要运用二进制优化来解决 ...

  2. hdu 2844 Coins (多重背包+二进制优化)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=2844 思路:多重背包 , dp[i] ,容量为i的背包最多能凑到多少容量,如果dp[i] = i,那么代表 ...

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

    HDOJ(HDU).2844 Coins (DP 多重背包+二进制优化) 题意分析 先把每种硬币按照二进制拆分好,然后做01背包即可.需要注意的是本题只需要求解可以凑出几种金钱的价格,而不需要输出种数 ...

  4. hdu1059 dp(多重背包二进制优化)

    hdu1059 题意,现在有价值为1.2.3.4.5.6的石头若干块,块数已知,问能否将这些石头分成两堆,且两堆价值相等. 很显然,愚蠢的我一开始并想不到什么多重背包二进制优化```因为我连听都没有听 ...

  5. HDOJ(HDU).1059 Dividing(DP 多重背包+二进制优化)

    HDOJ(HDU).1059 Dividing(DP 多重背包+二进制优化) 题意分析 给出一系列的石头的数量,然后问石头能否被平分成为价值相等的2份.首先可以确定的是如果石头的价值总和为奇数的话,那 ...

  6. HDOJ(HDU).2191. 悼念512汶川大地震遇难同胞――珍惜现在,感恩生活 (DP 多重背包+二进制优化)

    HDOJ(HDU).2191. 悼念512汶川大地震遇难同胞――珍惜现在,感恩生活 (DP 多重背包+二进制优化) 题意分析 首先C表示测试数据的组数,然后给出经费的金额和大米的种类.接着是每袋大米的 ...

  7. hdu 1171 Big Event in HDU(多重背包+二进制优化)

    题目链接:hdu1171 思路:将多重背包转为成完全背包和01背包问题,转化为01背包是用二进制思想,即件数amount用分解成若干个件数的集合,这里面数字可以组合成任意小于等于amount的件数 比 ...

  8. hdu 2191 (多重背包+二进制优化)

    Problem Description 急!灾区的食物依然短缺!为了挽救灾区同胞的生命,心系灾区同胞的你准备自己采购一些粮食支援灾区,现在假设你一共有资金n元,而市场有m种大米,每种大米都是袋装产品, ...

  9. Cash Machine POJ - 1276 多重背包二进制优化

    题意:多重背包模型  n种物品 每个m个  问背包容量下最多拿多少 这里要用二进制优化不然会超时 #include<iostream> #include<cstdio> #in ...

随机推荐

  1. 西邮linux兴趣小组2014纳新免试题(四)

    [第四关] 题目 http://findakey.sinaapp.com/ Example: String1:FFFF8 5080D D0807 9CBFC E4A04 24BC6 6C840 49B ...

  2. oracle pl/sql 函数

    函数用于返回特定的数据,当建立函数时,在函数头部必须包含return子句.而在函数体内必须包含return语句返回的数据.我们可以使用create function来建立函数. 1).接下来通过一个案 ...

  3. python 保存文本txt格式之总结篇,ANSI,unicode,UTF-8

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAA4wAAAEmCAIAAACmsIlUAAAgAElEQVR4nOydezxU+f/HP49WSstKkZ

  4. 从Thread.start()方法看Thread源码,多次start一个线程会怎么样

    这篇文章作为Thread类源码剖析的补充,从一个侧面来看Thread源码.也解答了面试高频问题:"多次start一个线程会怎么样?" 答案是:java.lang.IllegalTh ...

  5. sleep,yield,wait,notify,notifyAll

    1.wait,notify,notifyAll是Object的方法.他们必须在同步块中使用,并且当前线程必须已经获取了锁.wait方法,用来释放同步块对象上的锁,并且等待其他的线程唤醒(notify) ...

  6. NOIP2017SummerTraining0720

    这套题,看到第一题就想到了以前做过的运动鞋那道题,然后就往DP这个方向去思考,想来想去每什么思路,然后就去看第二题,第二题一看就是一道最短路的问题,但是它的建图十分困难, 怎么打都不知到该怎么建图,然 ...

  7. C# JAVA成员访问修饰符比较

    在面向对象的访问修饰符中常用的有public ,private ,protected C# 访问修饰符: private < protected internal < internal/p ...

  8. mysql中将时间转为秒

    项目中遇到的问题,需要将时间(时 分 秒)转为秒,业务上处理有些麻烦,尝试找了多种处理函数,然而并没有用 完美解决办法: TIME_TO_SEC   格式'HH:MM:SS'或HHMMSS SELEC ...

  9. Python自学笔记-面向对象相关(Mr seven)

    ---恢复内容开始--- http://www.cnblogs.com/wupeiqi/articles/5433893.html 类的成员可以分为三大类:字段.方法和属性. 一.字段 字段包括:普通 ...

  10. 【Java核心】ClassLoader原理及其使用

    又把博客的皮肤换了换,看着更加简洁舒心一些.前段的知识只是略懂,拿过来就能用,只是自己的审美和设计水平有限,实在难以弄出自己特别满意的东西,也算是小小的遗憾吧!言归正传,由于最近涉及到Java核心的东 ...