递归就可以解决,给你写个递归式吧;调用方法如下
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,所有数-1相加为n,知道a为 n,取值即可。
先排序,如果n比较小,暴力搜索。如果n比较大,用回溯法可以
1+1=几