背包问题
来源:互联网 发布:清华王奇 知乎 编辑:程序博客网 时间:2024/05/21 12:43
背包问题讲解:
P01: 01背包问题
P02: 完全背包问题
P03: 多重背包问题
P04: 混合三种背包问题
模板代码:Bag.h
#include <iostream>using namespace std;#define MAXN 505#define MAXV 10005int c[MAXN], v[MAXN], n[MAXN], dp[MAXV];int N, V;/*0-1背包有N件物品和一个容量为V的背包,每种物品都只有一件。第i件物品的费用是c[i],价值是w[i]。f[i][v]表示前i件物品恰放入一个容量为V的背包可以获得的最大价值f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}*/void ZeroOnePack(int cost,int value){int v; for( v = V; v >= cost; v--) dp[v] = max( dp[v], dp[v-cost]+value);}/*完全背包有N种物品和一个容量为V的背包,每种物品都有无限件可用。第i种物品的费用是c[i],价值是w[i]。令f[i][v]表示前i种物品恰放入一个容量为v的背包的最大权值f[i][v]=max{f[i-1][v-k*c[i]]+k*w[i]|0<=k*c[i]<=v}优化:f[i][v]=max{f[i-1][v],f[i][v-c[i]]+w[i]}*/void CompletePack(int cost, int value){int v; for( v = cost; v <= V; v++)dp[v] = max( dp[v], dp[v-cost]+value);}/*多重背包有N种物品和一个容量为V的背包。第i种物品最多有n[i]件可用,每件费用是c[i],价值是w[i]。令f[i][v]表示前i种物品恰放入一个容量为v的背包的最大权值f[i][v]=max{f[i-1][v-k*c[i]]+k*w[i]|0<=k<=n[i]}*/void MultiplePack(int cost,int value,int amount){ if( cost * amount >= V){ CompletePack(cost, value); return;} int k=1; while( k < amount){ ZeroOnePack(k*cost, k*value); amount = amount-k; k = k * 2;} ZeroOnePack(amount*cost,amount*value);}/*混合三种背包for i=1..N 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])*/
- 【无限背包】背包问题
- 背包问题---01背包
- 背包问题--部分背包
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- 编译Qt程序遇到ts_open、ts_fd 等未找到的解决方法
- linux进程的地址空间,核心栈,用户栈,内核线程
- DLL中创建的非模式对话框不能正常显示原因的解决
- P04: 混合三种背包问题
- SetWindowRgn在子控件中无效的处理办法
- 背包问题
- C 的文件操作
- 贴片电容颜色
- 没有绣花针,不揽瓷器活
- js小结
- android中SQLite数据库的操作
- c# winform实现气泡提示窗口
- Linux中oracle 解决backspace和上下键使用出现乱码
- JSP基础一