简单写了一下0/1背包的算法解释
无论哪种语言,基本上都是这个思路:
1. 初始化最大价值 maxValue=0;结果子集 S=重;
2. 对集合{1,2,…,n)的每一个子集T,执行下述操作:
2.1 初始化背包的价值 value=0;背包的重量 weight=0;
2.2 对子集T的每一个元素j
2.2.1 如果 weight+wj;<C,则 weight=weight+wj;value=value+vj;
2.2.2 否则,转步骤2考察下一个子集;
2.3 如果 maxValue<value,则 maxValue=value; S=T;
3. 输出子集S中的各元素;
都要查询2^n次的子集数量
一开始使用int数组【】来作为子方法中存储背包的序列,但数组不好实现动态自增长度,
转从设置ArrayList,尝试构建可以保存变化的背包序列。
import java.util.ArrayList;
public class 背包0_1 {
static int[] we={7,3,4,5}, va={42,12,40,25};
public static void main(String[] args) {
int maxValue=0, n=0;
//只需要传入maxValue这个总变量即可
System.out.println("最大值:"+check(maxValue));
}
private static int check(int maxValue){
ArrayList<Integer> N=new ArrayList<>();
//方法1 //int[] S=new int[4],N=new int[S.length] ;
for (int j = 0; j<we.length; j++) {
ArrayList<Integer> S = new ArrayList<Integer>();
int value=0,weight=0,i = 0,n=0;
i=j;
while (i<=3) {
if (weight + we[i] <= 10) {
weight += we[i];
value += va[i];
//System.out.println(maxValue + "第几次运行:" + n); //测试。。。。
//方法1 //S[n] = we[i];
S.add(we[i]);
n++;
}
i++;
//System.out.println("循环"+i); //测试。。。。。
}
//System.out.println("for循环"+j); //测试。。。。。
if(maxValue<value){
maxValue=value;
N= (ArrayList<Integer>) S.clone(); //这里主要是克隆一下数组
//
}
}
for (int k:N
) {
System.out.print(k+" ");
}
return maxValue;
}
}
如果需要改变背包材料的重量和数量
static int[] we={7,3,4,5}, va={42,12,40,25};
将这一行代码删除,换成Scanner或者BufferedReader输入你想要的数据。