您的位置:首页 > 其它

动态规划-试题(2)-背包问题

2017-08-30 11:14 176 查看

背包问题

/**

* 背包问题:

*

* 有N件物品和一个容量为V的背包。第i件物品的价值是v[i],重量是w[i]。

* 求解将哪些物品装入背包可使价值总和最大。

*

*

* 重新定义问题:

*

*

* 状态转移方程:

* 状态:设d(i, j)为前i件物品转到剩余体积为j的背包的最大价值

* 方程:d(i, j) = max{d(i-1, j), d(i-1, j-w[i])+v[i]}, j-w[i]>=0

*/

代码

/**
* 在这段代码里面,所有数组的第一位,也就是int[0]是无效的
* @param args
*/
public static void main(String[] args){

int n = 5;//物件数量
int v = 10;//背包空间

int[] value =  {0, 8, 10, 4, 5, 5};
int[] weight = {0, 6,  4, 2, 4, 3};

int[][] d = new int[n+1][v+1];//用于保存所求的最大价值

//遍历每一个物品
for (int i = 1; i <= n; i++) {
//这个物品在背包空间为1到V(最大)情况下的最大价值
for (int j = 1; j <= v; j++) {
//如果放得下
if (j >= weight[i]) {
int a = d[i-1][j];//不放的价值
int b = d[i-1][j - weight[i]] + value[i];//放的价值
d[i][j] = a > b ? a : b;
}else {
//放不下
d[i][j] = d[i-1][j];
}
}
}

System.out.println(d
[v]);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: