参考《挑战程序设计竞赛算法和数据结构》算法
当n的数目较少的时候,可将元素的全部组合都列举出来,每一个元素都有 “选” 和 “不选” 两种状况,总共就有2^n种jsp
思路:
假设输入的M值为8,可供选择的数为 【一、五、7】函数
调用①solve(0,8),i=0,m=8,①调用②③设计
①调用②solve(1,8)【不选择第一个元素】,①调用③solve(1,8-1)【选择第一个元素】code
②调用④solve(2,8)【不选择第二个元素】,②调用⑤solve(2,8-5)【选择第二个元素】;③调用⑥solve(2,7)【不选择第二个元素】,③调用⑦solve(2,7-5)【选择第二个元素】;blog
.....递归
单纯生成各类状况的二进制:如{0,0,0}、{1,1,1}、{1,0,1}等
#include
int n=3,S[3],j;
void rec(int i){
if(i==n){
for(j=0;j
printf("%d ",S[j]);
}
printf("\n");
return;
}
rec(i+1);
S[i]=1;
rec(i+1);
S[i] = 0;
}
int main(){
for(j=0;j
rec(0);
return 0;
}
完整程序:
#include
int n, A[50];
//从输入值m中,减去所选元素的递归函数
int solve(int i,int m){
if (m==0) return 1;
if (i>=n) return 0;
int res = solve(i+1,m) || solve(i+1,m-A[i]);
return res;
}
int main(){
int q,M,i;
scanf("%d",&n);
for(i=0;i
scanf("%d",&q);
for(i=0;i
scanf("%d",&M);
if(solve(0,M)) printf("yse\n");
else printf("no\n");
}
return 0;
}