无重复:形如
#include
using namespace std;
void dis_number(int num,int min,int a[],int level,int &count)//无重复拆分
{
for(int i=min;num-i>i;i++){
count++;
a[level]=i;
a[level+1]=num-i;
for(int j=0;j<=level+1;j++)
printf("%d ",a[j]);
printf("\n");
dis_number(num-i,i+1,a,level+1,count);
}
}
int dis_number_count(int num) //动规算拆分次数
{
int dp[100][100];
for(int i=0; i<=num; i++)
dp[0][i] = 1;
for(int i=1; i<=num; i++)
dp[i][0] = 0;
for(int i=1; i<=num; i++)
for(int j=1; j<=num; j++)
{
if(i=i;i++){
count++;
a[level]=i;
a[level+1]=num-i;
for(int j=0;j<=level+1;j++)
printf("%d ",a[j]);
printf("\n");
dis_number_same(num-i,i,a,level+1,count);//重复
}
}
int main()
{
loop:
int num;//输入数
scanf("%d",&num);
int count=0; //拆分计数
int a[100]; //存储数的拆分
dis_number(num,1,a,0,count); //从1开始无重复拆分num
printf("%d\n",count);
printf("-----------------\n");
count=0;
dis_number_same(num,1,a,0,count); //从1开始重复拆分num
printf("%d\n",count);
printf("-----------------\n");
goto loop;
}
--------------------------------------(利用 生成函数 求组合数)
#include
#include
#include
using namespace std;
void dis_number(int num,int min,int a[],int level,int &count)//无重复 指数时间
{
for(int i=min;num-i>i;i++){
count++;
//a[level]=i;
//a[level+1]=num-i;
//for(int j=0;j<=level+1;j++)
// printf("%d ",a[j]);
//printf("\n");
dis_number(num-i,i+1,a,level+1,count);
}
}
void dis_number_same(int num,int min,int a[],int level,int &count)//重复 指数时间
{
for(int i=min;num-i>=i;i++){
count++;
//a[level]=i;
//a[level+1]=num-i;
//for(int j=0;j<=level+1;j++)
// printf("%d ",a[j]);
//printf("\n");
dis_number_same(num-i,i,a,level+1,count);//重复
}
}
//如果只是要得到数的拆分数的话,利用生成函数(1+x+x^2+……)(1+x^2+x^4+……)……(1+x^n)中x^n的系数
#define MAXNUM 10000
long long dis_num_same(long long num) //重复 多项式时间
{
static long long a[MAXNUM+1],b[MAXNUM+1];
long long *mult=a, *multmp=b;
for(long long i=0;i<=num;i++)
mult[i]=1;
for(long long i=2;i<=num;i++){
for(long long m=0;m<=num;m++)
multmp[m]=mult[m];
for(long long j=i;j<=num;j+=i)
for(long long k=0;j+k<=num;k++)
multmp[j+k]+=mult[k];
swap(mult,multmp); //交换数组
}
return mult[num];
}
#define MAXNUM 10000
long long dis_num(long long num) // 无重复 多项式时间
{
static long long a[MAXNUM+1],b[MAXNUM+1];
long long *mult=a, *multmp=b;
for(long long i=0;i<=1;i++)
mult[i]=1;
for(long long i=2;i<=num;i++)
mult[i]=0;
int maxvalue=1;
for(int i=2;i<=num;i++){
for(int m=0;m<=maxvalue&&m<=num;m++)
multmp[m]=mult[m];
for(int m=maxvalue+1;m<=maxvalue+i&&m<=num;m++)
multmp[m]=0;
for(int k=0;k<=maxvalue&&i+k<=num;k++)
multmp[i+k]+=mult[k]; //maxvalue的使用 使得此处的multmp[i+k]总是预先赋值的了
maxvalue+=i;
swap(mult,multmp); //数组交换,免去一次赋值
}
return mult[num];
}
void dis_num_all(long long num) // 无重复小于等于num的所有数的无重复拆分方式 多项式时间
{
static long long a[MAXNUM+1],b[MAXNUM+1];
long long *mult=a, *multmp=b;
for(long long i=0;i<=1;i++)
mult[i]=1;
for(long long i=2;i<=num;i++)
mult[i]=0;
int maxvalue=1;
for(int i=2;i<=num;i++){
for(int m=0;m<=maxvalue&&m<=num;m++)
multmp[m]=mult[m];
for(int m=maxvalue+1;m<=maxvalue+i&&m<=num;m++)
multmp[m]=0;
for(int k=0;k<=maxvalue&&i+k<=num;k++)
multmp[i+k]+=mult[k];
maxvalue+=i;
swap(mult,multmp); //数组交换,免去一次赋值
}
for(int i=1;i<=num;i++)
printf("%d: %d\n",i,mult[i]);
}
int main()
{
clock_t ntimestart;
clock_t ntimeend;
loop:
int num;//输入数
scanf("%d",&num);
//int count=0; //拆分计数
//int a[100]; //存储数的拆分
//ntimestart = clock();
//dis_number(num,1,a,0,count); //从1开始无重复拆分num
//printf("%d\n",count+1);
//ntimeend = clock();
//printf("%f\n",(double)(ntimeend - ntimestart)/CLOCKS_PER_SEC);
//printf("-----------------\n");
count=0;
//ntimestart = clock();
//dis_number_same(num,1,a,0,count); //从1开始重复拆分num
//printf("%d\n",count+1);
//ntimeend = clock();
//printf("%f\n",(double)(ntimeend - ntimestart)/CLOCKS_PER_SEC);
//ntimestart = clock();
//printf("%lld\n",dis_num_same(num));
//ntimeend = clock();
//printf("%f\n",(double)(ntimeend - ntimestart)/CLOCKS_PER_SEC);
dis_num_all(num);
ntimestart = clock();
printf("%lld\n",dis_num(num));
ntimeend = clock();
printf("%f\n",(double)(ntimeend - ntimestart)/CLOCKS_PER_SEC);
goto loop;
}
----------------------------------(引申自微软14,根据特殊数组拆分)
#include
#include
using namespace std;
void dis_number_array(int sum,int minpos,int a[], int print_arr[],int level,int &count)//ÎÞÖظ´²ð·Ö
{
for(int i=minpos;sum-a[i]>i;i++){
count++;
print_arr[level]=a[i];
print_arr[level+1]=sum-a[i];
for(int j=0;j<=level+1;j++)
printf("%d ",print_arr[j]);
printf("\n");
dis_number_array(sum-a[i],i+1,a,print_arr,level+1,count);
}
}
int dis_number_array_count(int num, int a[], int k) //动规算拆分次数
{
int dp[100][100];
for(int i=0; i<=num; i++)
dp[0][i] = 1;
for(int i=1; i<=num; i++)
dp[i][0] = 0;
for(int i=1; i<=num; i++)
for(int j=1; j<=num; j++)
{
if(ia[i];i++){
print_arr[level]=a[i];
dis_number_array_(sum-a[i],i+1,a,k,print_arr,level+1,count);
}
}
int main()
{
loop:
int k,sum,count=0,a[100],print_arr[100];
cin>>sum>>k;
for(int i=0;i>a[i];
dis_number_array_(sum,0,a,k,print_arr,0,count);
cout<
using namespace std;
void dis_number_nlimit(int sum, int min, int n, int a[],int level,int &count)//无重复拆分
{
for(int i=min; i<=n && (sum-i>i);i++){
a[level]=i;
if( sum-i<=n ){
count++;
a[level+1]=sum-i;
for(int j=0;j<=level+1;j++)
printf("%d ",a[j]);
printf("\n");
}
dis_number_nlimit(sum-i,i+1,n,a,level+1,count);
}
}
int main()
{
loop:
int m,n;//输入数
cin>>m>>n;
int count=0; //拆分计数
int a[100]; //存储数的拆分
dis_number_nlimit(m,1,n,a,0,count); //从1开始无重复拆分num
cout<