01背包问题

01背包问题刷题总结:


125. 
背包问题 II

中文

English

 n 个物品和一个大小为 m 的背包. 给定数组 A 表示每个物品的大小和数组 V 表示每个物品的价值.

问最多能装入背包的总价值是多大?

Example

样例 1:

输入: m = 10, A = [2, 3, 5, 7], V = [1, 5, 2, 4]

输出: 9

解释: 装入 A[1] A[3] 可以得到最大价值, V[1] + V[3] = 9

样例 2:

public class Solution {

/**

* @param m: An integer m denotes the size of a backpack

* @param A: Given n items with size A[i]

* @param V: Given n items with value V[i]

* @return: The maximum value

*/

public int backPackII(int m, int[] A, int[] V) {

// write your code here

int n = A.length;

int[]f = new int[m+1];

int i,w;

for(i=1;i<=m;++i) {

f[i] = -1;

}

for(i=1;i<=n;++i) {

//f[0] f[1]

for(w=m;w>=0;--w) {

if(w>=A[i-1]&& f[w-A[i-1]]!=-1 ) {

f[w] = Math.max(f[w],f[w-A[i-1]]+V[i-1] );

}

}

}

int res = 0;

for (i=0;i<=m;++i) {

if(f[i]!=-1) {

res = Math.max(res,f[i]);

}

}

return res;

 

}

}

 

思路总结:

把数组压成一行,一定要倒着求

 

 

 

总结 backPack d方程:

dp[i][w] = max( dp[i-1][w], dp[i-1][ w-A(i-1)] + V(i-1) )

 

其中:

dp[i][w] 表示用前 i 个物品拼出重量w时最大总价值。

dp[i-1][w] 表示 i-1 个物品拼出重量 w时最大总价值

最后一个是用前 i-1 个物品拼出总重量 w -A(i-1) 最大总价值,加上第 i个物品。

 

 

Backpack 可行性

--题面:要求不超过 Target时能拼出的最大重量

--记录 f[i][w] = i个物品能不能拼出重量 w

backpack V, backpack VI , 计数型背包

--题面:要求有多少种方式拼出重量 Target

-- 记录 f[i][w] = i个物品有多少种方式拼出重量 w

backpack II, backpack iii , 最值型

-- 题面:记录能拼出的最大价值

-- 记录f[i][w] = i /种物品拼出重量 w能得到的最大价值

 

 

关键点:

-最后一步:

1. 最后一个背包内物品是哪个

2. 最后一个物品有没有背包

-数组大小和最大承重 Target有关

 

 

 

 

 

 

 

 

 

 

 

原文地址:https://www.cnblogs.com/lyr-2000/p/13060521.html