hdu 2844
本题的特殊性是价值与重量相等
将第i种物品分成若干件物品,其中每件物品有一个系数,
这件物品的费用和价值均是原来的费用和价值乘以这个系数。
使这些系数分别为1,2,4,…,2^(k-1),n[i]-2^k+1,且k是满足n[i]-2^k+1>0的最大整数。
例如,如果n[i]为13,就将这种物品分成系数分别为1,2,4,6的四件物品。
分成的这几件物品的系数和为n[i],表明不可能取多于n[i]件的第i种物品。
另外这种方法也能保证对于0..n[i]间的每一个整数,均可以用若干个系数的和表示
/*
* 2844_1.cpp
*
* Created on: 2013年7月30日
* Author: Administrator
*/ #include <iostream> using namespace std; /**
* n:物品的种数
* V:限定的价值.在这里可以认为是背包的容量
* c[]:用来保存每种物品的价值
* num[]:用来保存每种物品的数量
* f[v]:表示容量为v是所能获得的最大价值
*
*/
int f[100005];
int c[105],num[105];
int n,V; void ZeroOnePack(int cost , int weight){
for(int v = V ; v >= cost ; --v){
f[v] = max(f[v],f[v-cost] + weight);
}
} void CompletePack(int cost , int weight){ for(int v = cost ; v <= V ; ++v){
f[v] = max(f[v],f[v-cost] + weight);
}
} /**
* cost:每种物品所占的体积
* weight:每种物品的价值
* amount:每种物品有多少件
*/
void MultiplePack(int cost,int weight , int amount){ if(cost*amount >= V){//当物品总体积>=限制体积时,当成完全背包来解 CompletePack(cost,weight); }else{
int k = 1;
while( k < amount ){
ZeroOnePack(k*cost,k*weight);
amount -=k; k<<=1;
} if(amount>0){ ZeroOnePack(amount*cost,amount*weight); }
}
}
int main(){ while(cin>>n>>V,n||V){ for(int i = 1 ; i <= n ; ++i){
cin >> c[i];
} for(int i = 1 ; i <= n ; ++i ){
cin >> num[i];
} memset(f,0,sizeof(f)); for(int i = 1 ; i <=n ; ++i){
MultiplePack(c[i],c[i],num[i]);
} int ans = 0; for(int i = 1 ; i <= V ; ++i){
if(f[i] == i){//如果容量为i是所能获得的最大价值==i
++ans;//所能支付的钱数+1
}
} cout<<ans<<endl; }
}
hdu 2844的更多相关文章
- Coins(HDU 2844):一个会超时的多重背包
Coins HDU 2844 不能用最基础的多重背包模板:会超时的!!! 之后看了二进制优化了的多重背包. 就是把多重转变成01背包: 具体思路见:http://www.cnblogs.com/tt ...
- hdu 2844 poj 1742 Coins
hdu 2844 poj 1742 Coins 题目相同,但是时限不同,原本上面的多重背包我初始化为0,f[0] = 1;用位或进行优化,f[i]=1表示可以兑成i,0表示不能. 在poj上运行时间正 ...
- 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 ...
- Coins HDU - 2844 POJ - 1742
Coins HDU - 2844 POJ - 1742 多重背包可行性 当做一般多重背包,二进制优化 #include<cstdio> #include<cstring> in ...
- 题解报告:hdu 2844 & poj 1742 Coins(多重部分和问题)
Problem Description Whuacmers use coins.They have coins of value A1,A2,A3...An Silverland dollar. On ...
- hdu 2844 多重背包coins
http://acm.hdu.edu.cn/showproblem.php?pid=2844 题意: 有n个硬币,知道其价值A1.....An.数量C1...Cn.问在1到m价值之间,最多能组成多少种 ...
- hdu 2844 Coins (多重背包)
题意是给你几个数,再给你这几个数的可以用的个数,然后随机找几个数来累加, 让我算可以累加得到的数的种数! 解题思路:先将背包初始化为-1,再用多重背包计算,最后检索,若bb[i]==i,则说明i这个数 ...
- POJ 1742 hdu 2844 Coins
题目链接:http://poj.org/problem?id=1742 http://acm.hdu.edu.cn/showproblem.php?pid=2844 题目分类:动态规划 代码: #in ...
- hdu 2844 Coins (多重背包+二进制优化)
链接:http://acm.hdu.edu.cn/showproblem.php?pid=2844 思路:多重背包 , dp[i] ,容量为i的背包最多能凑到多少容量,如果dp[i] = i,那么代表 ...
随机推荐
- firebug中console命令尝试
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- java org.apache.struts.taglib.html.BEAN 没有找到
index.jsp <body> <a href="login2.do">登陆(struts标签)</a><br> </bod ...
- SQL批量信息保存(XML格式字符串数据)
/* *功能:SQL批量信息录入 *此存储过程获取表单信息,插入表中.*/CREATE PROC [dbo].[sp_SaveToMX1]@XML text --明细表XML字符串信息ASBEG ...
- java对mysql数据库进行单表筛选备份、还原操作
最近在做的一个项目需要对mysql数据库中的单个表格进行备份 其中,一部分表格需要进行筛选备份(例如对最近插入的1000条记录进行备份) 思路:java调用系统命令完成备份操作 假设现在有数据库tes ...
- MySQL分库分表环境下全局ID生成方案
在大型互联网应用中,随着用户数的增加,为了提高应用的性能,我们经常需要对数据库进行分库分表操作.在单表时代,我们可以完全依赖于数据库的自增ID来唯一标识一个用户或数据对象.但是当我们对数据库进行了分库 ...
- 各种driver的继承关系
AndroidDriver extends AppiumDriver extends DefaultGenericMobileDriver extends RemoteWebDriver
- 14_RHEL7安装mplayer
这里用nux-dextop仓库来配置 Nux Dextop桌面对CentOS和RHEL 6/7可用.它是一个面对CentOS.RHEL.ScientificLinux的含有许多流行的桌面和多媒体相关的 ...
- JavaScript-学习一加载不动
为先加载的js后加载的html 加载完js运行时因为未加载html的原因导致找不到js所控制的元素 所以解决的方法就是把js放到控制元素的下方 或者html的底部 做成函数的时候可以放在头部,也就是说 ...
- winform批量查询单号剔除重复
//查询分单函数 private string GetQueryInSubbillNo() { string strSubbillNO = " ...
- js获取ip方法
<script type="text/javascript" src="http://counter.sina.com.cn/ip/" charset=& ...