前言:
看了不少背包问题的讲解:
1、01背包问题,二维实现,滚动数组实现,一维实现;
2、完全背包问题,二维实现,一维实现;
3、多重背包(还没有);
4、筹够一百块求最少硬币数的算法;
自己大概撸了下代码,里面写了一些注释防止自己忘掉。下面贴出
我的代码:
/**
* =========== 01背包 ===========
* 一维:逆序遍历
* for(int j = capital + 1;j -- >= w[i];)
* dp[j] = max(dp[j - w[i]] + v[i], dp[j])
*
* 滚动数组:和上一元素结果集(相当于上一行)比较,使用k作为空间位置参数
* int k = i & 1
* dp[k][j] = dp[k ^ 1][j]
* if(j >= w[i])
* dp[k][j] = max(dp[k ^ 1][j - w[i]] + v[i], dp[k ^ 1][j])
*
* 二维:和上一元素结果集(相当于上一行)比较
* dp[i][j] = dp[i - 1][j]
* if(j >= w[i])
* max(dp[i][j], dp[i][j - w[i]] + v[i])
*
*
* =========== 完全背包 ===========
* 一维:正序遍历
* for(int j = w[i];j <= capital;j ++)
* dp[j] = max(dp[j - w[i]] + v[i], dp[j])
*
* 二维:每次 capital_i 的时候,得要比较 capital_i / w[i] 次
* int k = capital_i / w[i]
* if(k ++ >= 1)
* int temp;
* for(;k -- > 0;)
* temp = max(dp[i - 1][j - w[i] * k] + k * v[i], temp)
* dp[i][j] = max(dp[i - 1][j], temp)
*/
public class Package {
// 下标0不算入,从1开始
private static int[] mone