部分和
#include<stdio.h>
#define N 20
int a[N],b[N];
int n,k;
int dfs(int i, int sum);
int cou=0;
int main()
{
int i;
scanf(“%d%d”, &n,&k);
for(i=0; i<n; i++)
{
scanf(“%d”, &a[i]);
}
if(dfs(0,0))
{
printf(“Yes\n”);
// printf(“计算了%d\n次”,cou);
for(i=0; i<n; i++)
{
//scanf(“%d”, &a[i]);
//printf(“%d”,b[i]);
if(b[i])
printf(“%d “,a[i]);
}
}
else
printf(“No\n”);
return 0;
}
int dfs(int i, int sum)
{
cou++;
// 如果前n项都计算过了,则返回sum是否与k相等
if(i==n)
return sum==k;
// 不加上a[i]的情况
if(dfs(i+1, sum))
{
b[i]=0;
return 1;
}
// 加上a[i]的情况
if(dfs(i+1, sum+a[i]))
{
b[i]=1;
return 1;
}
// 无论是否加上a[i]都不能凑成k就返回false
return 0;
}
素数环
#include<string.h>
#include<stdio.h>
using namespace std;
int a[45]={0},b[21]={0},v[21]={0},n;
void init()//埃氏筛法筛选出素数
{
inti,j;
for(i=2;i<45; i++)
a[i]= i;
for(i=2; i*i<45; i++)
{
if(a[i] != 0)
for(j=i*2; j<45; j+=i)
{
a[j]= 0;
}
}
}
void dfs(int x)
{
inti,j;
if(x > 0 && b[0]!=1) //以1开头
{
return;
}
for(j=2; j<=x; j++)
{
if(!a[b[j-2]+b[j-1]]) //两素数之和不是素数之间返回
{
return;
}
}
if(x == n)//刚好n个数 ,是一种解
{
if(a[b[0] + b[x-1]]) //检查头和尾是不是素数
{
for(j=0; j<n; j++)
{
printf(“%d”,b[j]);
}
printf(“\n”);
return;
}
}
for(i=1; i<=n; i++)
{
if(!v[i])//没有使用过
{
b[x]= i;
v[i]= 1;
dfs(x+1);//列举第二个数
v[i]= 0;//恢复原来的状态
}
}
}
int main()
{
init();
inti,j,ca=1,T=0;
while(scanf(“%d”,&n))
{
if(n==0)
break;
T++;
printf(“Case%d:\n”,T);
memset(v,0,sizeof(v));
if(n==1)
{
printf(“1\n”);
}
elseif (n%2==0)
{
dfs(0);
}
else
{
printf(“NoAnswer\n”);
}
getchar();
}
return0;
}
组合数
#include <stdio.h>
int a[15];
void DFS(int n,int r)
{
for(inti = n; i > 0; i–)
{
a[r]= i;
if(r> 1)
{
DFS(i-1,r-1); //继续搜索
}
else
{
for(inti = a[0]; i > 0; i–) //打印搜索的结果
{
printf(“%d”,a[i]);
}
printf(“\n”);
}
}
}
int main()
{
intn,r;
scanf(“%d%d”,&n,&r);
a[0]= r;
DFS(n,r);
return0;
}
幸运三角形
#include<stdio.h>
int sum,n,a[25][25];
void dfs(int k,int p,int q)//p,q分别为1和0的个数 ,k为层数
{
int x,y;
if(k==n)//如果 k为n层且1和0的个数相同 ,sum++
{
if(p==q)
sum++;
return ;
}
for(int t=0; t<2; t++)
{
x=p,y=q;
a[0][k]=t; //为第一层赋值
t?x++:y++;
for(int i=1,j=k-1; j>=0; j–,i++)
{
a[i][j]=a[i-1][j]^a[i-1][j+1];//如果下层两个数相同,为1否则为0
a[i][j]?x++:y++;
}
dfs(k+1,x,y);
}
}
int main()
{
while(scanf(“%d”,&n))
{
sum=0;
if((n*(n+1)/2)%2==0)//如果个数为奇数 一定没有,偶数才有
dfs(0,0,0);
printf(“%d\n”,sum);
}
return 0;
}