- > 动规讲解基础讲解三——混合背包(背包模板)
2024-09-07 11:26:48
将01背包,完全背包,和多重完全背包问题结合起来,那么就是混合三种背的问题
根据三种背包的思想,那么可以得到
混合三种背包的问题可以这样子求解
for(int i=1; i<=N; ++i)
if(第i件物品是01背包)
zeroOnePack(c[i],w[i]);
else if(第i件物品是完全背包)
completePack(c[i],w[i]);
else if(第i件物品是多重完全背包)
multiplePack(c[i],w[i],n[i]);
这样能得到最优解的原因是,因为前一层已经是得到最优解了,
当前层求解最优解的时候,我们考虑要使用三种背包中的哪一种方法
而不用考虑前一层是怎么得到最优解的
#include <stdio.h>
#include <string.h>
int cash;
int n[],dk[];
int dp[];
inline int max(const int &a, const int &b)
{
return a < b ? b : a;
}
void CompletePack(int cost)
{
for(int i=cost; i<=cash; ++i)
dp[i] = max(dp[i],dp[i-cost]+cost);
}
void ZeroOnePack(int cost)
{
for(int i=cash; i>=cost; --i)
dp[i] = max(dp[i],dp[i-cost]+cost);
}
void MultiplePack(int cnt, int cost)
{
if(cnt*cost >=cash)//如果第i种物品的费用总和超过背包容量,那么就是完全背包问题
CompletePack(cost);
else
{
int k = ;//二进制拆分
while(k<cnt)//判断剩下的数字能不能够拆分为k
{
ZeroOnePack(cost*k);
cnt -=k;
k<<=;
}
ZeroOnePack(cnt*cost);
}
}
int main()
{
//输入的处理以及函数的调用
return ;
}
如果对你有所帮助,别忘了加好评哦;么么哒!!下次见!88
最新文章
- [Hadoop] Hadoop学习历程 [持续更新中…]
- salesforce 零基础学习(四十九)自定义列表分页之使用Pagination实现分页效果 ※※※
- linux的压缩命令
- 0929mysql前缀索引如何找到合适的位数
- Selenium WebDriver 处理table
- BZOJ2492 Revenge of Fibonacci
- [leetcode]_Merge Two Sorted Lists
- Java实战之04JavaWeb-05事务和连接池
- Flexigrid的使用(整合Struts2)
- UITextField的属性设置
- SQL函数学习(一):substring()函数
- 前端学PHP之Session
- python之列表作为函数的参数
- Banner图二三事
- mysql数据库索引优化与实践(一)
- SQL FORMAT() 函数
- SSIS 包部署错误 0xC0010014
- SQL优化笔记一:索引和explain
- vue2.0 技巧汇总
- 延期版本webstorm(解决许可证过期,注册,激活,破解,码,支持正版,最新可用)