01背包问题
来源:互联网 发布:lockin china 知乎 编辑:程序博客网 时间:2024/06/05 22:56
问题:给定n种物品和一个背包,物品i(1小于等于i小于等于n)的重量是Wi,其价值为Vi,背包容量为C,对每种物品只有两种选择:装入背包或者不装入背包。如下选择装入背包装入别爆的物品,使得装入背包中物品的总价值最大?
特点:每种物品仅有一件,可选择放或者不放。
用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。则其状态转移方程便是:
f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}
若放入第i件物品即“前i-1件物品放入剩下的容量为v-c[i]的背包中”,此时能获得的最大价值就是f[i-1][v-c[i]]再加上通过放入第i件物品获得的价值w[i]。
若不放入第i件物品即“前i-1件物品放入容量为v的背包中”,价值为f[i-1][v];
public class Bag
{
public int getMaxValue[][](int weight[], int value[])
{
int lenRow=weight.lenght;
int lenColumn=0;
for(int i=0;i<weight.length;i++)
lenColumn+=weight[i];
int F[][]=new int [lenRow][lenColumn];
for(int i=1;i<weight.length;i++)
{
for(int j=0;j<lenColumn;j++)
{
if(weight[i]>j)
F[i][j]=F[i-1][j];
else
{
if(F[i-1][j]>F[i-1][j-weight[i]]+value[i])
F[i][j]=F[i-1][j];
else
F[i][j]=F[i-1][j-weight[i]]+balue[i] ;
}
}
}
return F;
}
public static void main(String args[])
{
Bag test=new Bag();
int[] weight = {2,1,3,2};
int[] value = {12,10,20,15};
int[][] F = test.getMaxValue(weight, value);
for(int i = 0;i < F.length;i++)
{
for(int j = 0;j < F[0].length;j++)
System.out.print(F[i][j]+"\t");
System.out.println();
}
}
}
- 背包问题---01背包
- DP 背包问题 01背包
- 01背包--苹果,背包问题
- 01背包 完全背包问题
- 背包问题之01背包
- 背包问题之01背包
- 背包问题1:01背包
- 背包问题《1》01背包
- 01背包+完全背包问题
- 背包问题-背包01-苹果
- 背包问题之01背包
- 背包问题(01背包,完全背包,多重背包)
- 背包问题(01背包,完全背包,多重背包)
- 动态规划-----背包问题-----01背包,完全背包,多重背包
- 经典背包问题 01背包+完全背包+多重背包
- 背包(01背包、完全背包、多重背包)问题总结
- 背包问题(01背包,完全背包,多重背包)
- 经典背包问题 01背包+完全背包+多重背包
- bootstrap3中使用bootstrap-datetimepicker日期插件的用法
- Hystrix 使用与分析
- Spring基础学习教程(经典的Spring面试问答)-08
- SBT构建工具
- -bash: 08: value too great for base (error token is "08")
- 01背包问题
- 细密引脚芯片的焊接
- 工具类-HttpClientUtil
- LeetCode 36 Valid Sudoku
- javascript 闭包
- C#,往线程里传参数的方法总结
- ListView显示当前选取的item
- 应为本机上的jdk版本低导致spring-tool-suite无法启动
- 多线程之等待通知机制