POJ 1276 Cash Machine(多重背包的二进制优化)
题目网址:http://poj.org/problem?id=1276
思路:
很明显是多重背包,把总金额看作是背包的容量。
刚开始是想把单个金额当做一个物品,用三层循环来 转换成01背包来做。T了……
后面学习了 用二进制来处理数据。
简单地介绍一下二进制优化:✧(≖ ◡ ≖✿)
假设数量是8,则可以把它看成是1,2,4,1的组合,即这4个数的组合包括了1-8的所有取值情况。这是为什么呢?将它们转换成二进制再观察一下:
1:1
2:10
4:100
1:1
二进制都只有0,1。所以1,2,4已经能够组成1-7的所有情况,但是这样还不够 还要再加一个1 才能凑成8
或许有人会问 为什么不取到8,即1,2,4,8。注意!!所有的数加起来不可以超过数量。
我们主要是用到这些数的排列组合,取到8的话 上限就被我们扩大了,会取到原本不能取到的值。
将数量分解成之后,把number[i]*value当做一个物品,就可以转换成01背包啦~ 详情看代码!
代码:
#include <cstdio>
#include <cstring>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;
int dp[];
int a[];
vector<int>v;
int main(){
int cash;
int n,m,x;
while(scanf("%d%d",&cash,&n)!=EOF){
memset(dp,, sizeof(dp));
v.clear();
dp[]=;
for (int i = ; i < n; ++i) {
scanf("%d%d",&m,&x);
for (int j = ; j <= m; j<<=) {//二进制优化
v.push_back(j*x);
m-=j;
}
if(m>) v.push_back(m*x);//别忘了剩余的数
}
for (int i = ; i < v.size(); ++i) {
for (int j = cash; j >=v[i] ; --j) {
dp[j]=max(dp[j-v[i]],dp[j]);
}
}
for (int i = cash; i >= ; --i) {
if(dp[i]){
printf("%d\n",i);
break;
}
}
}
return ;
}
POJ 1276 Cash Machine(多重背包的二进制优化)的更多相关文章
- Poj 1276 Cash Machine 多重背包
Cash Machine Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 26172 Accepted: 9238 Des ...
- [poj 1276] Cash Machine 多重背包及优化
Description A Bank plans to install a machine for cash withdrawal. The machine is able to deliver ap ...
- poj 1276 Cash Machine_多重背包
题意:略 多重背包 #include <iostream> #include<cstring> #include<cstdio> using namespace s ...
- POJ-1276 Cash Machine 多重背包 二进制优化
题目链接:https://cn.vjudge.net/problem/POJ-1276 题意 懒得写了自己去看好了,困了赶紧写完这个回宿舍睡觉,明早还要考试. 思路 多重背包的二进制优化. 思路是将n ...
- POJ1276 - Cash Machine(多重背包)
题目大意 给定一个容量为M的背包以及n种物品,每种物品有一个体积和数量,要求你用这些物品尽量的装满背包 题解 就是多重背包~~~~用二进制优化了一下,就是把每种物品的数量cnt拆成由几个数组成,1,2 ...
- HDU 1059(多重背包加二进制优化)
http://acm.hdu.edu.cn/showproblem.php?pid=1059 Dividing Time Limit: 2000/1000 MS (Java/Others) Me ...
- 动态规划:HDU2844-Coins(多重背包的二进制优化)
Coins Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Subm ...
- Cash Machine (POJ 1276)(多重背包——二进制优化)
链接:POJ - 1276 题意:给你一个最大金额m,现在有n种类型的纸票,这些纸票的个数各不相同,问能够用这些纸票再不超过m的前提下凑成最大的金额是多少? 题解:写了01背包直接暴力,结果T了,时间 ...
- 【转载】poj 1276 Cash Machine 【凑钱数的问题】【枚举思路 或者 多重背包解决】
转载地址:http://m.blog.csdn.net/blog/u010489766/9229011 题目链接:http://poj.org/problem?id=1276 题意:机器里面共有n种面 ...
随机推荐
- Day 25 网络基础2
ip地址划分 ip地址由32位二进制组成. 什么是二进制?0101 10进制 0-9 10 2进制 0-1 10 二进制1100 ==1X2^3+1X2^2+0X2^1+0X2^0 =12 十进制15 ...
- MOOC 数据库系统笔记(二):数据库系统的基本结构及其演变发展
数据库系统的结构抽象与演变 数据库的标准结构 DBMS管理数据的三个层次 1.External Level = User Level 某一用户能够看到与处理的数据,全局数据中的某一部分 2.Conce ...
- 【Jsp】利用iframe实现action不跳转
<form role="form" target="id_frame" action="dk" method="post&q ...
- Scala函数式编程(三) scala集合和函数
前情提要: scala函数式编程(二) scala基础语法介绍 scala函数式编程(二) scala基础语法介绍 前面已经稍微介绍了scala的常用语法以及面向对象的一些简要知识,这次是补充上一章的 ...
- 报错:ORA-25150:不允许对区参数执行ALERING
alter table 表名 MOVE storage ( next 128 ) ; -- Add/modify columns alter table 表名 add 列名 var ...
- Elastic Static初识(01)
写在前面 Elastic Static 是指由Elasticsearch,Logstash,Kibana,Beats等组件结合起来而构成的一个数据收集,分析,可视化的一个架构.我们经常听说过的ELK就 ...
- Jmeter日记,很乱很随意
这个笔记是写给自己看的,很乱很随意,可能以后自己都看不懂.哈哈 Jmeter两种录制方式: 1使用badboy 2.使用代理 浏览器设置代理 参数化 随机参数化 插件的使用 官网下载和说明https: ...
- ELK7.3实战安装配置文档
整体架构 一:环境准备 1.环境规划准备 192.168.43.16 jdk,elasticsearch-master ,logstash,kibana 192.168.43.17 jdk,ela ...
- python的元组存储的实质和多元赋值
python中有一种赋值机制即多元赋值,采用这种方式赋值时,等号两边的对象都是元组并且元组的小括号是可选的.通常形式为 x, y, z = 1, 2, 'a string' 等同于 (x, y, z) ...
- 数据分析--numpy的基本使用
一.numpy概述 NumPy是高性能科学计算和数据分析的基础包.它是pandas等其他各种工具的基础. NumPy的主要功能: ndarray,一个多维数组结构,高效且节省空间 无需循环对整组数据进 ...