整数n分成k份,且每份不能为空,任意两份不能相同(不考虑顺序)。
例如,n=7,k=3则4中分法应为:1,1,5; 1,2,4; 1,3,3; 2,2,3.
且下面3中分法被认为是相同的
1,1, 5; 1,5,1; 5,1,1
问有多少种不同的分法。
输入样例
n=7,k=3;
输出
1 1 5
1 2 4
1 3 3
2 2 3
解法:
import java.util.*;
public class test2
{
public static void main(String[] args){
ArrayList<Integer> ar=new ArrayList<Integer>();
HashSet hs=new HashSet();
HashSet sb=new HashSet();
StringBuffer st=new StringBuffer();
Scanner scanner=new Scanner(System.in);
int n=0,r=0;
System.out.println("请输入你的自然数数目n:");
n=scanner.nextInt();
System.out.println("请输入份数r:");
r=scanner.nextInt();
int[] a=new int[r];
for(int i=0;i<r;i++)
a[i]=1;
while(true)
{
if(!(a[0]==((n/r)+1)&&a[r-1]==(n-r+2)))
{
int sum=0;
for(int i=0;i<r;i++)
sum+=a[i];
if(sum==n)
{
for(int i=0;i<r;i++)
{
ar.add(a[i]);
}
java.util.Collections.sort(ar);
for(int i=0;i<ar.size();i++)
st.append(ar.get(i));
// if(st.length()==r)
sb.add(st.toString());
while(st.length()!=0)
{
st.delete(0,1);
}
while(!ar.isEmpty())
{
ar.remove(0);
}
}
for(int i=r-1;i>=0;i--)
if(a[i]==(n-i+1))
{
while(i!=0)
{
a[i]=1;
if(a[i-1]==n) i--;
else
{
a[i-1]=a[i-1]+1;
break;
}
}
break;
}
else
{
a[i]=a[i]+1;
break;
}
}
else break;
}
System.out.println(sb);
System.out.print(sb.size());
}
}
递归算法和回溯忘了,只能用一些蠢方法做!
效率不高,算100,4 时,就要想那么1,2秒钟,分的等分一大,就算不出来。唉!