编写程序求:给出一个整数n,一个数组{a1,a2,...,an},将n表示成数组中若干项的和,写出所有的可能。
例如:n=10,数组为{1,8,4,3,5,2},所有的可能为{1,4,3,2},{1,4,5},{8,2},{3,5,2}。...
例如:n=10,数组为{1,8,4,3,5,2},所有的可能为{1,4,3,2},{1,4,5},{8,2},{3,5,2}。
展开
4个回答
展开全部
递归就可以解决,给你写个递归式吧;调用方法如下
int a[6]={1,8,4,3,5,2};
int chose[6]={-1,-1,-1,-1,-1,-1};
decompose( a,5,0,10,chose,0);
void print( int *chose , int n ){
for( int i = 0 ; i < n ; ++i )
printf("%d\t",chose[i]);
printf("\n");
}
//参数分别是,背包数组,数组最大下标,当前选到的第k个元素,要求解的和,已选的结果,已选结果的下标
void decompose( int *array , int max , int k , int subn , int *chose , int c ){
if( subn < 0 )
return ;
if( !subn ){
print( chose , c );
}
for( int i = k ; i <= max ; ++i ){
chose[c] = array[i];
decompose( array , max , i+1 , subn-array[i] , chose , c+1 );
chose[c] = -1;
}
}
int a[6]={1,8,4,3,5,2};
int chose[6]={-1,-1,-1,-1,-1,-1};
decompose( a,5,0,10,chose,0);
void print( int *chose , int n ){
for( int i = 0 ; i < n ; ++i )
printf("%d\t",chose[i]);
printf("\n");
}
//参数分别是,背包数组,数组最大下标,当前选到的第k个元素,要求解的和,已选的结果,已选结果的下标
void decompose( int *array , int max , int k , int subn , int *chose , int c ){
if( subn < 0 )
return ;
if( !subn ){
print( chose , c );
}
for( int i = k ; i <= max ; ++i ){
chose[c] = array[i];
decompose( array , max , i+1 , subn-array[i] , chose , c+1 );
chose[c] = -1;
}
}
更多追问追答
追问
我想知道的是输入一个数据n,数组也很大,用递归也行吗?
追答
那就比较慢了。这算法是n!的,我在给你一个思路吧,对于这种的更快。先对数组排序,然后再使用回溯法,求解的过程中剪枝会很快。
展开全部
程序我就不写了,麻烦,思路:所有数相加为n,所有数-1相加为n,知道a为 n,取值即可。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
先排序,如果n比较小,暴力搜索。如果n比较大,用回溯法可以
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询