01背包【模板】
来源:互联网 发布:知乎大神 推荐 编辑:程序博客网 时间:2024/05/22 16:01
01背包是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。用子问题定义状态:即F[i,v] 表示前i 件物品恰放入一个容量为v 的背包可以获得的最大价值。则其状态转移方程便是:
F[i,v]=max(F[i,v],F[i-1,v-w[i]]+v[i])
这个方程非常重要,基本上所有跟背包相关的问题的方程都是由它衍生出来的。所以有必要将它详细解释一下:“将前i 件物品放入容量为v 的背包中”这个子问题,若只考虑第i 件物品的策略(放或不放),那么就可以转化为一个只和前 i - 1 件物品相关的问题。如果不放第i 件物品,那么问题就转化为“前i - 1 件物品放入容量为v 的背包中”,价值为F[i - 1; v];如果放第i 件物品,那么问题就转化为“前i - 1 件物品放入剩下的容量为v - Ci 的背包中”,此时能获得的最大价值就是F[i - 1; v - Ci] 再加上通过放入第i 件物品获得的价值Wi。伪代码如下:
F[0,0..V ]<--0
for i<--1 to N
for v<--Ci to V
F[i,v]=max(F[i,v],F[i-1,v-w[i]]+v[i])
这个方程非常重要,基本上所有跟背包相关的问题的方程都是由它衍生出来的。所以有必要将它详细解释一下:“将前i 件物品放入容量为v 的背包中”这个子问题,若只考虑第i 件物品的策略(放或不放),那么就可以转化为一个只和前 i - 1 件物品相关的问题。如果不放第i 件物品,那么问题就转化为“前i - 1 件物品放入容量为v 的背包中”,价值为F[i - 1; v];如果放第i 件物品,那么问题就转化为“前i - 1 件物品放入剩下的容量为v - Ci 的背包中”,此时能获得的最大价值就是F[i - 1; v - Ci] 再加上通过放入第i 件物品获得的价值Wi。伪代码如下:
F[0,0..V ]<--0
for i<--1 to N
for v<--Ci to V
F[i; v]<--max{F[i - 1, v], F[i - 1, v - Ci] +Wi}
代码如下:
# include <stdio.h> # include <stdlib.h> # include <string.h> # define max(x,y) x>y?x:y; int v[1001];//价值 int w[1001];//重量 int dp[1001][1001]; int main() { int n,m,i,j; while(scanf("%d%d",&m,&n)!=EOF) { memset(dp,0,sizeof(dp));//初始化 for(i=1; i<=n; i++) scanf("%d%d",&w[i],&v[i]); for(i=1; i<=n; i++) // 物品数 for(j=m; j>=w[i]; j--) //放入背包 dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]);// 与前面对比 printf("%d\n",dp[n][m]); } return 0;}
0 0
- 01背包,完全背包,模板
- 01背包,完全背包模板
- 01背包、完全背包、多重背包模板
- 模板-01背包-完全背包-多重背包
- 01背包、完全背包、多重背包模板
- 01背包+完全背包+多重背包模板
- 01背包 完全背包 多重背包模板
- 01背包模板和完全背包模板
- 【模板】01背包
- 01背包【模板】
- ZeroOnePack - 01背包模板
- 01背包模板(2602)
- 01背包模板
- 【常用模板】 01背包
- nyoj289 01背包模板
- 01-背包模板
- 01背包问题模板
- 01背包模板、完全背包 and 多重背包(模板)
- String和StringBuffer的区别
- 入侵检测(IPS)--基础知识
- 解决git提交时提示“git did not exit cleanly (exit code 1)” 问题
- Linux 的启动流程
- 在北京的那三年——跳槽
- 01背包【模板】
- Hibernate快速入门
- 初学安卓平分空间排列相同内嵌布局
- 输入某年某月某日,判断这一天是这一年的第几天?
- linux下 配置两台绿色版tomcat
- 字符串的全排列和组合算法(转)
- jQuery事件
- [搜索] POJ 3984 迷宫问题
- 经纬财富:广州现货白银操作建议