HDU 2844 Coins 背包问题 + 二进制优化
题目大意:某个人有n种硬币,每种硬币价值为v,数量为c,问在总价值不超过m的条件下,最多有多少种组合方式。
题目思路:
1.对于某种硬币 如果v*c 大于 m,就意味着无论取多少枚硬币,只要总价值不大于m就取不完该种硬币--完全背包。
2.如果某种硬币,如果v*c 不大于m,就意味着这是多重背包,因此可以用二进制方法优化一下。
3.对于不大于m的任意数字j,dp[j]=0代表无法组合成j,dp[j]=1 代表可以组合成j,dp[j]=dp[j]|dp[j-v[i]*k](k为选择第i种硬币的数量)。
二进制优化:1,2,4,8……可以组合成任意数,将十进制数字1,2,4,8……转化成二进制
1
10
11
100
……
我们可以发现1,2,4,8……等数字的二进制每一位上都可以组合形成0或1,因此可以组合成其他任意数字。
- #include<cstdio>
- #include<stdio.h>
- #include<cstdlib>
- #include<cmath>
- #include<iostream>
- #include<algorithm>
- #include<string>
- #include<cstring>
- #include<vector>
- #include<queue>
- #define INF 0x3f3f3f3f
- #define MAX 1000005
- using namespace std;
- int dp[MAX],v[MAX],c[MAX],n,m;
- int main()
- {
- int i,j,k;
- while(scanf("%d%d",&n,&m),n+m)
- {
- for(i=;i<=n;i++)
- scanf("%d",&v[i]);
- for(i=;i<=n;i++)
- scanf("%d",&c[i]);
- memset(dp,,sizeof(dp));
- dp[]=;
- for(i=;i<=n;i++)
- {
- if(c[i]*v[i] >= m)
- {
- for(j=v[i];j<=m;j++)//完全背包
- dp[j]=dp[j]|dp[j-v[i]];
- }
- else
- {
- for(k=;k<=c[i]/;k*=)//二进制优化
- {
- for(j=m;j>=v[i]*k;j--)//多重背包
- {
- dp[j]=dp[j]|dp[j-v[i]*k];
- }
- }
- k=c[i]-k+;
- for(j=m;j>=v[i]*k;j--)
- dp[j]=dp[j]|dp[j-v[i]*k];
- }
- }
- int ans=;
- for(i=;i<=m;i++)
- if(dp[i])
- ans++;
- printf("%d\n",ans);
- }
- return ;
- }
HDU 2844 Coins 背包问题 + 二进制优化的更多相关文章
- hdu 2844 多重背包二进制优化
//http://www.cnblogs.com/devil-91/archive/2012/05/16/2502710.html #include<stdio.h> #define N ...
- HDOJ(HDU).2844 Coins (DP 多重背包+二进制优化)
HDOJ(HDU).2844 Coins (DP 多重背包+二进制优化) 题意分析 先把每种硬币按照二进制拆分好,然后做01背包即可.需要注意的是本题只需要求解可以凑出几种金钱的价格,而不需要输出种数 ...
- 背包系列练习及总结(hud 2602 && hdu 2844 Coins && hdu 2159 && poj 1170 Shopping Offers && hdu 3092 Least common multiple && poj 1015 Jury Compromise)
作为一个oier,以及大学acm党背包是必不可少的一部分.好久没做背包类动规了.久违地练习下-.- dd__engi的背包九讲:http://love-oriented.com/pack/ 鸣谢htt ...
- HDU 3591 (完全背包+二进制优化的多重背包)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3591 The trouble of Xiaoqian Time Limit: 2000/1000 M ...
- hdu 1171 Big Event in HDU(多重背包+二进制优化)
题目链接:hdu1171 思路:将多重背包转为成完全背包和01背包问题,转化为01背包是用二进制思想,即件数amount用分解成若干个件数的集合,这里面数字可以组合成任意小于等于amount的件数 比 ...
- hdu 2844 Coins
Coins Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total Submission(s): Accepted S ...
- hdu 2191 (多重背包+二进制优化)
Problem Description 急!灾区的食物依然短缺!为了挽救灾区同胞的生命,心系灾区同胞的你准备自己采购一些粮食支援灾区,现在假设你一共有资金n元,而市场有m种大米,每种大米都是袋装产品, ...
- hdu 2844 Coins 多重背包(模板) *
Coins Time Limit: 2000/1 ...
- D - D 分糖果HDU - 1059(完全背包+二进制优化)
有两个小朋友想要平分一大堆糖果,但他们不知道如何平分需要你的帮助,由于没有spj我们只需回答能否平分即可. 糖果大小有6种分别是1.2.3.4.5.6,每种若干颗,现在需要知道能不能将这些糖果分成等额 ...
随机推荐
- hdu_5790_Prefix(trie+主席树)
题目链接:hdu_5790_Prefix 题意: 给你n个字符串,字符串总长度不超过10W,然后给你一个区间,问你这个区间的字符串不相同的前缀有多少个. 题解: 由于z与上一个答案有关,所以强制在线, ...
- C# Monads的实现(一)
了解Haskell语言的朋友都知道它是一门纯函数式编程,输出结果只跟输入参数相关,这导致Haskell不能有输入输出函数,因为不同的环境下,输入相同,但输出可能有所不同.Haskell语言中,变量的值 ...
- Android 数据过滤器:Filter
类图: 通常可以将SearchView和ListView结合,实现数据的搜索和过滤. 1.监听SearchView,SearchView.setOnQueryTextListener(OnQueryT ...
- 单尺度二维离散小波重构(逆变换)idwt2
clc,clear all,close all; load woman; %单尺度二维离散小波分解.分解小波函数haar [cA,cH,cV,cD]=dwt2(X,'haar'); %单尺度二维离散小 ...
- iptables允许FTP
在iptables里设置允许访问ftp(建立连接,数据传输) 由于ftp服务在建立连接和传输数据时,使用的时不同的端口,建立连接的端口20.21,数据传输的端口可以自定义: 修改ftp配置文件,指定用 ...
- ListCtrl中垂直滚动条自动滚动
在用ListCtrl控件时,当向该控件中添加数据时,怎么样可以把滚动条时时滚动到最后一行,这样便可看到添加的新数据内容 1 加完数据后执行 EnsureVisible(最后一行索引) 可以保证滚动到最 ...
- RegOpenKey(注册表定位器) 1.5 中文免费绿色版
软件名称: RegOpenKey(注册表定位器) 1.5 中文免费绿色版 软件语言: 简体中文 授权方式: 免费软件 运行环境: Win7 / Vista / Win2003 / WinXP / Wi ...
- c# 获取命名空间 类名 方法名
c# 获取命名空间 类名 方法名 转[http://blog.sina.com.cn/s/blog_3fc2dcc1010189th.html] 分类: Winform public static ...
- RVM: instsallation
login as user, do the following: curl -L https://get.rvm.io | sudo bash -s stable # add user to grou ...
- 《JavaScript高级程序设计》读书笔记 ---函数
函数函数对任何语言来说都是一个核心的概念.通过函数可以封装任意多条语句,而且可以在任何地方.任何时候调用执行.ECMAScript 中的函数使用function 关键字来声明,后跟一组参数以及函数体. ...