https://zhengyang2015.gitbooks.io/lintcode/backpack_i_92.html
public int backPack(int m, int[] A) {
if(m == 0 || A == null || A.length == 0){
return 0;
}
int n = A.length;
int[][] fillPack = new int[m + 1][n + 1];
for(int i = 0; i <= m; i++){
fillPack[i][0] = 0;
}
for(int j = 0; j <= n; j++){
fillPack[0][j] = 0;
}
for(int i = 1; i <= m; i++){
for(int j = 1; j <= n; j++){
if(i - A[j - 1] >= 0){
//第二种情况为要第j件物品,则最优情况为背包容量为i-第j件物品体积时前j-1件物品的最优值加上第j件物品的值。
fillPack[i][j] = Math.max(fillPack[i][j - 1], fillPack[i - A[j - 1]][j - 1] + A[j - 1]);
}else{//一种情况为不要第j件物品,则最优情况为背包容量为i时前j-1件物品的最优值;
fillPack[i][j] = fillPack[i][j - 1];
}
}
}
return fillPack[m][n];
}
第二种方法dp[i][j]表示前i件物品能否填满容量为j的背包。分两种情况:一种情况为不要第i件物品,则dp[i][j]=dp[i-1][j];第二种情况为要第j件物品,则dp[i][j] = dp[i-1][j - A[j]],不过这种情况要求j - A[j]>0。取两种情况里面较大的作为dp[i][j]的值。
public int backPack(int m, int[] A) {
boolean f[][] = new boolean[A.length + 1][m + 1];
f[0][0] = true;
for (int i = 0; i < A.length; i++) {
for (int j = 0; j <= m; j++) {
f[i + 1][j] = f[i][j];
if (j >= A[i] && f[i][j - A[i]]) {
f[i + 1][j] = true;
}
} // for j
} // for i
for (int i = m; i >= 0; i--) {
if (f[A.length][i]) {
return i;
}
}
return 0;
}
https://zhengyang2015.gitbooks.io/lintcode/backpack_ii_125.html
public int backPackII(int m, int[] A, int V[]) {
if(m == 0 || A == null || A.length == 0){
return 0;
}
int n = A.length;
int[][] value = new int[m + 1][n + 1];
for(int i = 1; i <= m; i++){
for(int j = 1; j <= n; j++){
if(i -A[j - 1] >= 0){
value[i][j] = Math.max(value[i][j - 1], value[i - A[j - 1]][j - 1] + V[j - 1]);
}else{
value[i][j] = value[i][j - 1];
}
}
}
return value[m][n];
}
public int backPackII(int m, int[] A, int V[]) {
int[] f = new int[m + 1];
for(int i = 0; i < n; i++){
for(int j = m; j >= A[i]; j--){//\\
if(f[j] < f[j - A[i]] + V[i]){
f[j] = f[j - A[i]] + V[i];
}
}
}
return f[m];
}
public int backPackII(int m, int[] A, int V[]) {
if(m == 0 || A == null || A.length == 0){
return 0;
}
int n = A.length;
int[][] value = new int[m + 1][2];
for(int j = 1; j <= n; j++){
for(int i = 1; i <= m; i++){
if(i -A[j - 1] >= 0){
value[i][j % 2] = Math.max(value[i][(j - 1) % 2], value[i - A[j - 1]][(j - 1) % 2] + V[j - 1]);
}else{
value[i][j % 2] = value[i][(j - 1) % 2];
}
}
}
}
Lintcode: Backpack II - neverlandly - 博客园
用子问题定义状态:即f[i][v]表示前 i 件物品恰放入一个容量为 j 的背包可以获得的最大价值。则其状态转移方程便是: f[i][j] = max{f[i-1][j], j>=A[i-1]? f[i-1][j-A[i-1]]+V[i-1] : 0}
public int backPackII(int m, int[] A, int V[]) {
8 int[][] res = new int[A.length+1][m+1];
9 res[0][0] = 0;
10 for (int i=1; i<=A.length; i++) {
11 for (int j=0; j<=m; j++) {
12 if (j - A[i-1] < 0)
13 res[i][j] = res[i-1][j];
14 if (j - A[i-1] >= 0) {
15 res[i][j] = Math.max(res[i-1][j], res[i-1][j-A[i-1]]+V[i-1]);
16 }
17 }
18 }
20 return res[A.length][m];
21 }
Use one dimension array:
public int backPackII(int m, int[] A, int V[]) {
int[] d = new int[m+1];
for (int i = 1; i <= A.length; i++) {
for (int j = m; j >= 0; j--) {
if (j == 0) {
d[j] = 0;
} else {
if (A[i-1] <= j) {
d[j] = Math.max(d[j-A[i-1]]+V[i-1], d[j]);
}
}
}
}
return d[m];
}
O(nm)
http://www.cnblogs.com/EdwardLiu/p/4269149.html
Given n items with size A[i], an integer m denotes the size of a backpack.
How full you can fill this backpack?
Note
You can not divide any item into small pieces.
2D code:
7 public int backPack(int m, int[] A) {
8 // write your code here
9 boolean[][] res = new boolean[A.length+1][m+1];
10 res[0][0] = true;
11 for (int i=1; i<=A.length; i++) {
12 for (int j=0; j<=m; j++) {
13 res[i][j] = res[i-1][j] || (j-A[i-1]>=0 && res[i-1][j-A[i-1]]);
14 }
15 }
16 for (int j=m; j>=0; j--) {
17 if (res[A.length][j]) return j;
18 }
19 return 0;
20 }
1D code:
7 public int backPack(int m, int[] A) {
8 if (A.length==0) return 0;
9
10 int len = A.length;
11 boolean[] size = new boolean[m+1];
12 Arrays.fill(size,false);
13 size[0] = true;
14 for (int i=1;i<=len;i++)
15 for (int j=m;j>=0;j--){
16 if (j-A[i-1]>=0 && size[j-A[i-1]])
17 size[j] = size[j-A[i-1]];
18 }
19
20 for (int i=m; i>=0;i--)
21 if (size[i]) return i;
22
23 return 0;
24 }
Backpack III 440
https://zhengyang2015.gitbooks.io/lintcode/backpack_iii_440.html
public int backPackIII(int[] A, int[] V, int m) {
// Write your code here
int[] f = new int[m + 1];
for(int i = 0; i < A.length; i++){
for(int j = A[i]; j <= m; j++){
//对于当前物品i,若j从小到大的话,很可能在j之前的j-A[i]时已经放过第i件物品了,在j时再放就是重复放入;若j从大到小,则j之前的所有情况都没有更新过,不可能放过第i件物品,所以不会重复放入。
if(f[j - A[i]] + V[i] > f[j]){
f[j] = f[j - A[i]] + V[i];
}
}
}
return f[m];
}
Backpack IV 562
https://zhengyang2015.gitbooks.io/lintcode/backpack_iv_562.html
[7]
public int backPackIV(int[] nums, int target) {
int[] dp = new int[target + 1];
dp[0] = 1;
for(int i = 0; i < nums.length; i++){
for(int j = nums[i]; j <= target; j++){
dp[j] += dp[j - nums[i]];
}
}
return dp[target];
}
Backpack V 563
https://zhengyang2015.gitbooks.io/lintcode/backpack_v_563.html
[7]
public int backPackV(int[] nums, int target) {
int[] dp = new int[target + 1];
dp[0] = 1;
for(int i = 0; i < nums.length; i++){
for(int j = target; j >= nums[i]; j--){
dp[j] += dp[j - nums[i]];
}
}
return dp[target];
}
https://zhengyang2015.gitbooks.io/lintcode/backpack_vi_564.html
[4]
public int backPackVI(int[] nums, int target) {
int[] dp = new int[target + 1];
dp[0] = 1;
for(int i = 1; i <= target; i++){
for(int j = 0; j < nums.length; j++){
if(i - nums[j] >= 0){
dp[i] += dp[i - nums[j]];
}
}
}
return dp[target];
}
Read full article from
Lintcode: Backpack II - neverlandly - 博客园