经典算法之背包问题

来源:互联网 发布:贝思外贸软件数据导出 编辑:程序博客网 时间:2024/05/17 08:38
 背包问题
 
 一小偷偷东西
 商场内有N件货品,每件货物重为wi,自身为价值vi
 求小偷背包内所能装的东西的最大价值


这里假设一共有5件货品,重量分别为:2 3 4 5 9,   对应的货品价值分别为:  3 4 5 8 10.



代码实现:

public class Main {public static void main(String[] args) {int N = 5;  //设定商场内一共有5件货品int W = 20;  //设货品中最大重量为20int[][] B = new int[N+1][W+1];   //组建最大价值二维表 B[0][*]与B[*][0]值均为0int[] w = {0, 2, 3, 4, 5, 9};int[] v = {0, 3, 4, 5, 8, 10};for (int i = 1; i <= N; i++) {for (int C = 1; C <= W; C++) {   //C为背包的最大承重if (w[i] > C) {B[i][C] = B[i-1][C];} else {int value1 = B[i - 1][C - w[i]] + v[i];   //偷int value2 = B[i - 1][C];   //不偷B[i][C] = value1 > value2 ? value1 : value2;}}}System.out.println(B[N][W]);   }}

思路讲解:

  最大价值二维表B(i, C)中, C为背包剩余最大承重, i为取到的第i件货品

 当第i件货品的重量大于背包剩余最大承重时B(i, C) = B(i-1, C),既第i件货物不可偷

 当第i件货品重量在背包剩余最大承重范围之内时,这时小偷有两种选择: 偷 或 不偷

   若小偷偷得该物,那么B(i, C) = B(i-1, C-w[i])+v[i]

   若小偷不偷该件货品,则B(i, C) = B(i-1, C)

 那么在第i件货品可被偷取的情况下最大价值B(i, C)的值就为"偷"与"不偷"两种情况中的最大值



运行结果:






查阅相关git代码请移步:https://github.com/striner/javaCode/blob/master/knapsack







阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 伊伴平底女鞋 伊伴专柜 依伴 伊伴怎么样 伊伴专卖店 露伴 伊伴鞋怎么样 tata鞋专卖店 巨日 马丁靴 他她女鞋正品专柜 女生高跟鞋 百丽旗下品牌 大东鞋 伊塔库亚 伊和 伊屈泼帕 伊尚柏丽 伊佳医疗整形医院 伊佳欢水晶玻璃杯 伊光 伊兰 法师伊凡 伊凡 伊凡四世 伊凡与灰额猫 伊凡灰额猫山羊绵羊完整故事 伊凡与灰额猫山羊绵羊在聊天 伊凡与灰额猫故事 伊凡与灰额猫民间故事简介 伊凡与灰额猫故事简短 殖民大明 伊凡爱吃糖 欧洲民间故事伊凡和灰额猫 钢铁原核 疯狂伊凡 末日融宠系统 云中伊凡 伊凯 马伊利 伊利 伊利云商 伊利股票 伊利丹