我正在尝试编写一个java代码来获取子集的组合总数,其中sum等于x,其中n是使用递归的元素数量。我写了代码,但似乎需要更多优化,因为它花了很多时间来得到结果
import java.util.*;
class subset
{
public static void main(String[] args)
{
int n,x,z;
int m[]=new int[30];
Scanner sc=new Scanner(System.in);
n=sc.nextInt();
x=sc.nextInt();
for(int i=0;i<n;i++)
{
m[i]=sc.nextInt();
}
z=func(0,m,x);
System.out.println(z);
}
static int func(int i,int m[],int w)
{
if(i==m.length)
{
return 0;
}
if(m[i]==w)
return (1+func(i+1,m,w));
else
{
return((func(i+1,m,w-m[i])+func(i+1,m,w)));
}
答案 0 :(得分:0)
我发现了如何优化它。我只是整理了输入,然后设置一个约束,如果func函数计算的总和大于子集总和(即x),它将丢弃它。
import java.util.*;
class subset
{
public static void main(String[] args)
{
int n,x,z;
Scanner sc=new Scanner(System.in);
n=sc.nextInt();
x=sc.nextInt();
int m[]=new int[n];
long b=System.currentTimeMillis();
for(int i=0;i<n;i++)
{
m[i]=sc.nextInt();
}
Arrays.sort(m);
for(int i=0;i<m.length;i++)
{
System.out.print(" "+m[i]+" " );
}
z=func(0,m,x);
System.out.println(z);
System.out.println(System.currentTimeMillis()-b);
}
static int func(int i,int m[],int w)
{
if(i==m.length||m[i]>w)
{
return 0;
}
if(m[i]==w)
return (1+func(i+1,m,w));
else
{
return((func(i+1,m,w-m[i])+func(i+1,m,w)));
}
}
}