子集和数问题——回溯法
已知n个正数:wi, 1<=i<=n, 和M。要求找出{wi }的所有子集使得子集内元素之和等于M。例如:
n=4, (w1,w2,w3,w4)=(11,13,24,7),M=31 则满足要求的子集是(11,13,7)和(24,7)。
package com.lanxi.demo1;
public class Subset {
static int M,n;
static int[] w=new int[100];
static int[] x=new int[100];
public static void SumOfSub(int s, int k, int r)//s:当前和数 k:当前个数 r:总数和
{
int i;
x[k]=1;
if(s+w[k]==M) //子集找到
{
System.out.print("answer:");
for(i=1; i<=k; i++)
if(x[i]==1) System.out.print(w[i]+" ");
System.out.println("");
}else if(s+w[k]+w[k+1]<=M)
SumOfSub(s+w[k], k+1, r-w[k]);
if(s+r-w[k]>=M && s+w[k+1]<=M)
{
x[k]=0;
SumOfSub(s, k+1, r-w[k]);
}
}
public static void main(String arg[])
{
int s,k,r;
n=4;
w[1]=7;
w[2]=11;
w[3]=13;
w[4]=24;
M=31;
s=0;
k=1;
r=55;
SumOfSub(s, k, r);
}
}
时间最会骗人,但也能让你明白,这个世界上没有什么是不能失去的,留下的尽力珍惜,得不到的都不重要
浙公网安备 33010602011771号