c语言取数列中的一个数,穷举法:从数列中任意选取几个数,相加可否获得m,C语言描述...

参考《挑战程序设计竞赛算法和数据结构》算法

d18f9c1d111caa48dfc8e8e6ae773aef.png

当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

.....递归

d13b41fdba9211b8efb015c71891775a.png

单纯生成各类状况的二进制:如{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;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值