HDU2844买表多重背包问题
题目大意都不大好懂,是利用手头上的硬币看看能组合出多少种价格,也就是跑完背包,看看有多少背包符合要求

剩下的就是多重背包的问题了
1.第一个处理办法就是直接当01背包进行存储和处理
2.第二个处理办法就是扫描物品时,当这个物品和数量产生的总价格大于限制时,采用完全背包的方法往里放不大的时候就按01背包的方法放
因为对于每一件物品我们所考虑的问题就是,放不放和放多少的问题
其实这两个方法都一样,只不过第一个方法啊直观上的解法就是扩充数组而第二个的直观解法节约了空间

学习和理解以下代码的时候,我有两个地方不好懂

1.二进制压缩原理:

我们都知道背包是一层一层向上构建的

只要抓住  1   2    4    8    16    32    ....    2^n这些数字可以合成  1到2^(n-1)-1中任何数字
简单来说:基础是0,第一次我取一个,dp更新的也只是取 1 个的基础
第二次我取两个,dp数组更新的就会是1个,2 个和3 个(二的基础加一的基础)的基础了
 以此类推为了防止越出基础范围,所以每次要减去k,看看k还能不能再增加~

2.第二个就是最后符合条件的为什么是大于等于0就可以

这里跟题目理解的有些关系,对于背包的每一个容量,都必须完全装满才可以

所以这也是为什么对dp数组初始化的时候只把基础dp[0]初始化为0,其余的都初始化为相对无穷小

这样才能层层递推,而且递推出来的都是装的满满的背包

例如输入

2 5

1 4 2 1

那么第一次更新为01背包,更新了数组dp[1]

第二次也是01,更新了数组dp[2]

第三次01,更新了dp[4]和dp[5]

#include <iostream>
#include <cstdio>
#include <string.h>
#define inf 0xffffff
using namespace std;
const int maxn = 1e6;
const int maxm = 200;
int a[maxm],c[maxm];
int dp[maxn];
void Zero_one_pack(int m,int v,int w)
{
for(int i = m;i >= v;i--)
dp[i] = max(dp[i],dp[i-v]+w);
// cout<<"dp2 = "<<dp[5]<<endl;
}
void Complete_pack(int m,int v,int w)
{
for(int i = v;i <= m;i++)
dp[i] = max(dp[i],dp[i-v]+w);
}
void multiplePack(int m,int v,int w,int num)
{
if(v * num >= m)
{
Complete_pack(m,v,w);
return;
}
int k = 1;
for(k;k <= num;k <<= 1)
{
Zero_one_pack(m,k*v,k*w);
num -= k;
}
if(num)
Zero_one_pack(m,num*v,num*w);
}
int main()
{
int n,m;
while(~scanf("%d %d",&n,&m))
{
if(n == 0 && m == 0)break;
for(int i = 0;i < n;i++)
scanf("%d",&a[i]);
for(int i = 0;i < n;i++)
scanf("%d",&c[i]);
for(int i = 1;i <= m;i++)
dp[i] = -inf;
//背包必须要装满,所以初始赋值为负无穷
//对0赋值为0,层层向上递推
dp[0] = 0;
for(int i = 0;i < n;i++)
{
multiplePack(m,a[i],a[i],c[i]);
}
int sum = 0;
for(int i = 1;i <= m;i++)
{
if(dp[i] > 0)
{
sum++;
}
}
cout<<sum<<endl;
}
return 0;
}

HDU2844买表——多重背包初探的更多相关文章

  1. HDU2844 Coins(多重背包)

    多重背包就是每种物品有数量限制时求解最大价值. 如果一种物品数量和重量之积超过背包容量,可视为完全背包:其余情况通过二进制拆分,将几个数量的物品看成一个,转化为01背包求解. 按照这种思路代码是这样的 ...

  2. hdu2844(多重背包)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2844 题意:一位同学想要买手表,他有n种硬币,每种硬币已知有num[i]个.已知手表的价钱最多m元,问 ...

  3. HDU2844 Coins 多重背包

    Coins Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  4. HDU-2844 Coins(多重背包)

    Problem Description Whuacmers use coins.They have coins of value A1,A2,A3...An Silverland dollar. On ...

  5. hdu2844 &amp; poj1742 Coin ---多重背包--两种方法

    意甲冠军:你有N种硬币,每个价格值A[i],每个号码C[i],要求. 在不超过M如果是,我们用这些硬币,有多少种付款的情况下,.那是,:1,2,3,4,5,....,M这么多的情况下,,你可以用你的硬 ...

  6. 假期训练六(poj-1753,递归+hdu-2844,多重背包)

    题目一:传送门 题意:有一个4*4的棋盘,每次翻转一个棋子和它的上下左右的四个棋子,判断翻转多少次之后可以变为纯色的棋盘. 思路:总共有C(0,16)+C(1,16)+C(2,16)+……+C(16, ...

  7. (混合背包 多重背包+完全背包)The Fewest Coins (poj 3260)

    http://poj.org/problem?id=3260   Description Farmer John has gone to town to buy some farm supplies. ...

  8. hdu 2191 多重背包 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活

    http://acm.hdu.edu.cn/showproblem.php?pid=2191 New~ 欢迎“热爱编程”的高考少年——报考杭州电子科技大学计算机学院关于2015年杭电ACM暑期集训队的 ...

  9. --hdu 2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活(多重背包)

    解题思路: 多重背包:第 i 件物品有 j 个可用. 本题中 第 p[i] 类大米 有 c[i] 袋大米可买 ,故本题为多重背包. n(总钱数).m(种类) p[i] 单价 h[i] 重量 c[i] ...

随机推荐

  1. mysql技术内幕之常规使用

    mysql中:终止语句方法: 1.在语句结尾处,输入分号(:)表示语句到此结束 2.使用\g(意思是go) \G以垂直的方式显示结果,每行显示一个值 数据库:数据库中包含表,对表中数据执行插入,检索, ...

  2. POJ2349 Arctic Network

    原题链接 先随便找一棵最小生成树,然后贪心的从大到小选择边,使其没有贡献. 显然固定生成树最长边的一个端点安装卫星频道后,从大到小选择边的一个端点作为卫星频道即可将该边的贡献去除. 所以最后的答案就是 ...

  3. 如何修改隐藏Zblog/WordPress默认后台登录地址

    我相信很多博主站长都遇到过站点被暴力破解,虽然未被破解,但是经常收到那些尝试登录失败的邮件提醒也会心慌慌的.对于这种情况,最好的办法就是修改/隐藏我们的后台登录地址. 关于zblogASP后台登录地址 ...

  4. mysql 查两个表之间的数据差集

    需要查两个表之间的差集 首先,想到的是主键直接not in select mailbox_id from co_user where mailbox_id not in (select mailbox ...

  5. [Jmeter] 将参数从Jenkins传递给Jmeter

    Configuration in Jmeter Configuration in Jenkins

  6. 组合数问题(NOIP2016)

    题目链接:组合数问题 这道题可以算当年第二简单的. 这里要用到两个技巧: 用杨辉三角递推计算组合数 运用前缀和 有了这两点,这道题就出来了. 我们先运用杨辉三角推出题目范围内所能用到的所有组合数,然后 ...

  7. php结合layui实现前台加后台操作

    一:前台加载出前端页面: HTML: lay-data="{width:800,height:400, url:'data.php', page:true, id:'test'} js: l ...

  8. Python之生成器及内置函数篇4

    一.可迭代对象 #1.什么是迭代?:迭代是一个重复的过程,并且每次重复都是基于上一次的结果而来 #2.可迭代的对象:在python中,但凡内置有__iter__方法的对象,都是可迭代的对象 #3.迭代 ...

  9. python学习 day09 (3月14日)----函数

    一.函数的进阶 1.1 动态参数 1.2* ** 1.3*args , **kwargs 1.4 函数的注释 1.5名称空间 1.6函数的嵌套全局变量 : 贴边写的局部变量 : 不是贴边写的. ''' ...

  10. 2018.12.14 codeforces 932E. Team Work(组合数学)

    传送门 组合数学套路题. 要求ans=∑i=0nCni∗ik,n≤1e9,k≤5000ans=\sum_{i=0}^n C_n^i*i^k,n\le 1e9,k\le 5000ans=∑i=0n​Cn ...