背包问题
来源:互联网 发布:嵌入式就业前景 知乎 编辑:程序博客网 时间:2024/06/03 19:10
背包问题目的是在有限的容量下求得可以获得的最大值,状态转移方程为:
// f[i,j] = Max{ f[i-1,j-Wi]+Vi( j >= Wi ), f[i-1,j] }
其中i表示前i种物品可供选择,j的意思是当前使用的背包容量为j,当有i种物品可供选择时,可以容纳的最大值为
1、背包容量为j时有i-1种物品可供选择的值,即f[i-1,j]
2、有i-1个物品可供选择包容量为j减去第i和物品的重量时的值加上第i个物品的价值
两者中的较大值。
其含义分别是:
在包里不装第i个物品,即直接取 i-1种物品可供选择时的值;
装第i个物品,即在包中空出第i个物品的重量的容量可以容纳的值再加上第i个物品的价值。
直接上代码:
public class BagQuestion { // f[i,j] = Max{ f[i-1,j-Wi]+Vi( j >= Wi ), f[i-1,j] } public static int bestAnswer(int[] weight, int[] value, int capacity) { if (weight == null || value == null || weight.length != value.length) return -1; int[][] dp = new int[weight.length][capacity + 1]; for (int i = 1; i <= capacity; i++) { if (i >= weight[0]) { dp[0][i] = value[0]; } else { dp[0][i] = 0; } } for (int i = 1; i < weight.length; i++) { for (int j = 1; j <= capacity; j++) { if (j - weight[i] >= 0) dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]); else dp[i][j] = dp[i - 1][j]; } } return dp[weight.length - 1][capacity]; } public static void main(String[] args) { int[] weight = { 1, 2, 1 }; int[] value = { 2, 7, 3 }; int maxValue = bestAnswer(weight, value, 2); System.out.println(maxValue); }}
阅读全文
0 0
- 【无限背包】背包问题
- 背包问题---01背包
- 背包问题--部分背包
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- CSU-ACM2017暑期训练10-并查集&&HASH C
- 关于DBUtils中QueryRunner的一些解读.
- Oracle学习笔记2—分组/子查询
- hadoop系列之一环境准备
- 8.7早做题感悟
- 背包问题
- POJ 1611 The Suspects(并查集模板)
- Logistic Regression Formula deduction
- DAY56 JavaScript基础1
- 解决Wine安装时提示You could try running: rpm -Va –nofiles –nodigest问题
- LightOJ
- python爬天气网历史数据
- 排序算法之选择排序
- 2010年计算机联考真题——一维数组循环左移