在java中使用动态编程进行子集计数

时间:2014-08-24 11:31:07

标签: java subset

我正在尝试编写一个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)));     

         }

1 个答案:

答案 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)));     

     }
 }

}