问题:
给定n个正整数wi和一个正整数m,在这n个正整数中找出一个子集,使得子集中的正整数之和等于m。
解的形式:
设定一个n元组(x0,x1,...xn-1),如果wi包含在这个子集中,xi就等于1,反之等于0.
BoundFunction:
算法伪代码:
/**
*
*/
package com.iteye.caoruntao.sumofsub;
/**
* @author caoruntao
*
*/
public class SumOfSub {
private int w[];
private int m;
private int x[];
public SumOfSub(int w[], int m, int n){
this.w = w;
this.m = m;
this.x = new int[n];
}
public void computeSumOfSub(int s, int k, int r){
x[k] = 1;
if(s+w[k] == m){
printResult(k);
System.out.println("*************");
}
else if(s+w[k]+w[k+1] <= m){
computeSumOfSub(s+w[k],k+1,r-w[k]);
}
if(s+r-w[k]>=m && s+w[k+1]<= m){
x[k] = 0;
computeSumOfSub(s, k+1, r-w[k]);
}
}
public void printResult(int k){
for(int i=0; i<=k; i++){
if(x[i] == 1){
System.out.println(i+1);
}
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int w[] = new int[]{7,11,13,24};
SumOfSub sumOfSub = new SumOfSub(w,31,4);
int r = 0;
for(int i=0; i<4; i++){
r += w[i];
}
sumOfSub.computeSumOfSub(0, 0, r);
}
}