Java—01背包、完全背包 01背包问题的定义: 有N种物品和一个容量为V的背包,每种物品只能装1件。第i种物品的费用是v,价值是w。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。
这里问题具体为: int[] weight = {0,3,4,5};//重量 int[] value = {0,4,5,2};//价格 int max = 10; //最大载重 有3种物品和一个容量 int max= 10 的背包, 每种物品无限多,重量和价值分别是 int[] weight = {0,3,4,5}; int[] value ={0,4,5,2};求装入那些物品可使重量不超过背包容量,且价值总和最大。
完整代码如下: // 01背包问题 int[] w = {0,3,4,5};//重量 int[] v = {0,4,5,6};//价格 int max = 10; //最大载重
//创建二维数组,实现所有情况:横向以此是背包载重,纵向是物品列表,将每次最优结果填充到该数组中 int[][] maxValue = new int[w.length][max];
for(int i=0;i<max;i++){//外层是背包的容量,依次从0-max,一个个测试 for(int n=0;n<w.length;n++){//每一次背包确定载重时,依次拿物品来装,取得当前载重最高价值 if(i==0 || n==0){//起始状态 maxValue[n][i] = 0; } else{ //否则,开始判断当前物品能否放到当前载重的背包中 if(i<w[n]){//当前物品重量是超过载重的,则使用上一次最优结果 maxValue[n][i] = maxValue[n-1][i]; } else{ //否则,可以放也可以不放,分别计算放 和 不放 的结果 int v1 = maxValue[n-1][i];//不放,就是上次最大值了 int v2 = maxValue[n-1][i-w[n]] + v[n];//放,则将上一次最大价值加上本次价值 maxValue[n][i] = Math.max(v1, v2); } } } } for(int n=0;n<w.length;n++){ for(int i=0;i<max;i++){ System.out.print(maxValue[n][i]+"\t"); } System.out.println(); }
System.out.println(maxValue[w.length-1][max-1]);
如图列表:
完全背包问题的定义: 有N种物品和一个容量为V的背包,每种物品都有无限件可用。第i种物品的费用是v,价值是w。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。 这里问题具体为: // 完全背包问题 int[] w={0,3,2,5,1,6,4};//重量 int[] v={0,6,5,10,2,16,8};//价格 int max = 10; //最大载重 有6种物品和一个容量 int max= 10 的背包, 每种物品无限多,重量和价值分别是 int[] weight = {0,3,2,5,1,6,4}; int[] value ={0,6,5,10,2,16,8};求装入那些物品可使重量不超过背包容量,且价值总和最大。
完整代码如下: int[] w={0,3,2,5,1,6,4}; int[] v={0,6,5,10,2,16,8}; int max=10;
int[] m=new int[w.length]; for(int i=0;i<w.length;i++) { m[i]=w[i]; } Arrays.sort(m);
int q=max/m[1]; int[] f=new int[q]; int[][] maxValue=new int[w.length][max+1];
for(int i=0;i<=max;i++) { for(int j=0;j<w.length;j++) { if(i==0||j==0) { maxValue[j][i]=0; } else { if(i<w[j]) { maxValue[j][i]=maxValue[j-1][i]; } else { for(int k=1,g=0;k<=i/w[j];k++,g++) { f[g]=maxValue[j-1][i-(k*w[j])]+k*v[j]; } Arrays.sort(f); int v1=maxValue[j-1][i]; maxValue[j][i]=Math.max(v1,f[0]); f=new int[q]; } } } }
for(int n=0;n<w.length;n++){ for(int i=0;i<=max;i++){ System.out.print(maxValue[n][i]+"\t"); } System.out.println(); }
System.out.println(maxValue[w.length-1][max]);
|
相关文章: