01背包 模板1 2 总结

物品质量 w[0] w[1]  w[2] ....... w[n]                背包容量c               T

物品价值 v[0]  v[1]  v[2]  .......  v[n]              物品种类 n                N

(一)设DP(x,y)   表示  从前x项物品中  取出装入  体积为y的背包 的  物品的最大价值。

前x项物品(0---- x-1 , X)   去装          体积容量为y的背包

|--------       0                                     当 x=0 或 y=0

DP(x,y)     |                DP(x-1,y)                           不装 第x 种

|                 DP( x-1,y-w[x] )  +  v[x]        y-w[x]>=0  装 第x 种

(二)设DP(x,y) 表示   从第x项物品开始  到 第n项物品  中取物品装入  体积为y 的背包  的    得到的最大价值。

第x项物品        (x,   x+1  ,  X+2  ,  x+3  , ...........M ......n)    

|--------       0                                     当 x=M+1  或 y=0

DP(x,y)     |                  DP(x+1,y)                           不装 第x 种

|                 DP( x+1,y-w[x] )  +  v[x]        y-w[x]>=0  装 第x 种

动态规划算法思想1:

设m[i][j]用来表示从前i项物品中区取出装入体积为j的背包的物品的最大价值。

其中i的范围为0到n,其中j的范围为0到c,程序要寻求的解为m[n][c]。

可以分以下三种情况:

①m[0][j]对所有的j的值为0(物品种类为0), m[i][0]对所有的i的值为0(体积为0)

②当前的体积j大于等于w[i]时, m[i][j]是下面两个量的最大值:m[i-1][j] (不装)和 m[i-1][j-w[i-1]]+v[i] (装)

③当前的体积j小于w[i]时,m[i][j]等于m[i-1][j]

动态规划算法思想2:

设m[i][j]用来表示从第i项物品开始到第n项物品中取物品装入体积为j的背包的得到的最大价值。

其中i的范围为0到n-1,其中j的范围为0到c,程序要寻求的解为m[0][c]。

可以分为:

①m[n-1][j] 在当j>=0并且j< w[n-1] 时等于0(装不下),否则等于v[n-1] (可以装上)

②当前的体积j大于等于w[i]时, m[i][j]是下面两个量的最大值:m[i+1][j] 和 m[i+1][ j-w[i] ]+v[i]

③当前的体积j小于w[i]时,m[i][j]等于m[i+1][j]

01背包 模板1 2 总结,布布扣,bubuko.com

时间: 2024-10-15 13:58:44

01背包 模板1 2 总结的相关文章

1085 背包问题(0-1背包模板题)

1085 背包问题(0-1背包模板题)(51NOD基础题) 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 在N件物品取出若干件放在容量为W的背包里,每件物品的体积为W1,W2--Wn(Wi为整数),与之相对应的价值为P1,P2--Pn(Pi为整数).求背包能够容纳的最大价值. Input 第1行,2个整数,N和W中间用空格隔开.N为物品的数量,W为背包的容量.(1 <= N <= 100,1 <= W <= 10000) 第2 - N + 1行,每行

01背包模板、全然背包 and 多重背包(模板)

转载请注明出处:http://blog.csdn.net/u012860063 贴一个自觉得解说不错的链接:http://www.cppblog.com/tanky-woo/archive/2010/07/31/121803.html 模版就直接贴代码: 01背包模板: /* 01背包问题 01背包问题的特点是,">每种物品仅有一件.能够选择放或不放. 01背包问题描写叙述: 有N件物品和一个容量为V的背包. 第i件物品的重量是c[i],价值是w[i]. 求解将哪些物品装入背包可使这些物品

01背包 模板1

// 0-1背包问题的普通递归算法#include <stdio.h>#define M 10int w[M]={5,3,2,1},v[M]={4,4,3,1};int limit_w=7,maxv=0,n=4; void find(int i,int tw,int tv) //从第i种物品开始,当前已有的重量tw和价值tv{ if (i<n) //进入第i+1件的条件,还没有选完n种物品 if (tw+w[i]<=limit_w ) //选择第i件物品 find(i+1,tw+w

01背包模板

转载请注明出处:http://blog.csdn.net/u012860063 模版就直接贴代码: 01背包问题 01背包问题的特点是,每种物品仅有一件,可以选择放或不放. 01背包问题描述: 有N件物品和一个容量为V的背包.第i件物品的重量是c[i],价值是w[i]. 求解将哪些物品装入背包可使这些物品的重量总和不超过背包容量,且价值总和最大. #include <stdio.h> int max(int x,int y) { int M; M=x>y ? x : y; return

HDU 3339 In Action【最短路+01背包模板/主要是建模看谁是容量、价值】

 Since 1945, when the first nuclear bomb was exploded by the Manhattan Project team in the US, the number of nuclear weapons have soared across the globe. Nowadays,the crazy boy in FZU named AekdyCoin possesses some nuclear weapons and wanna destroy

POJ 3624 Charm Bracelet(01背包模板)

Charm Bracelet Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 45191   Accepted: 19318 Description Bessie has gone to the mall's jewelry store and spies a charm bracelet. Of course, she'd like to fill it with the best charms possible fro

【0-1 背包模板】 poj 3624

先看个未经优化的二维空间dp: #include <iostream> #include <cstdio> #include <cmath> #include <memory.h> using namespace std; const int maxn1=3500; const int maxn2=1300; int dp[maxn2][maxn2]; //int dp[maxn2]; int w[maxn1],v[maxn2]; int m,n; int

hdu 2602 Bone Collector 【01背包模板】

Bone Collector Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 40404    Accepted Submission(s): 16786 Problem Description Many years ago , in Teddy's hometown there was a man who was called "Bo

You Like Cake(超大01背包模板题)

You Like Cake 题目描述 双十一就要来啦!而Yuno刚刚获得了一笔X元的奖金.那么是不是应该清空下购物车呢? 购物车总共有N个物品,每个物品的价格为Vi,Yuno想尽可能地把手头的奖金给花光,所以她要精心挑选一些商品,使得其价格总和最接近但又不会超过奖金的金额.那么Yuno最后最少可以剩下多少钱呢? 输入 第一行,两个正整数N和X. 第二行,N个正整数Vi表示第i个物品的价格. 输出 输出一个整数,表示Yuno最后最少可以剩下的钱数. 样例输入 4 50 1 2 3 4 样例输出 4