回溯法是一种以深度优先搜索的方式系统的搜索问题的解
穷举n位2进制数全排列
#include<stdio.h>
int n;
int a[101];
void search(int i)
{
if(i==n)
{
print(a,n);
}
else
{
a[i]=1;
search(i+1);
a[i]=0;
search(i+1);
}
}
void print(int a[],int n)
{
for(int i=0;i<n;i++)
{
printf("%d",a[i]);
}
printf("\n");
}
int main()
{
scanf("%d",&n);
search(0);
return 0;
}
求解0 1 背包问题
#include<stdio.h>
int w[20];
int v[20];
int n;
int W;
int maxv=0;
int x[20];
void dfs(int i,int tw,int tv,int a[])
{
if(i>n)
{
if(tv>maxv)
{
maxv=tv;
for(int j=1;j<=n;j++)
{
x[j]=a[j];
}
}
}
else{
if(tw+w[i]<=W)
{
a[i]=1;
dfs(i+1,tw+w[i],tv+v[i],a);
}
a[i]=0;
dfs(i+1,tw,tv,a);
}
}
int main()
{
int a[20];
scanf("%d",&n);
scanf("%d",&W);
for(int i=1;i<=n;i++)
{
scanf("%d",&w[i]);
}
for(int i=1;i<=n;i++)
{
scanf("%d",&v[i]);
}
dfs(1,0,0,a);
printf("%d",maxv);
return 0;
}
左剪枝+if(tw+tw[i]<=W)
装载问题
#include<stdio.h>
int tw,c1,c2,n;
int maxw=0;
int w[20];
int x[20];
void dfs(int i,int tw,int a[])
{
if(i>n)
{
if(tw>maxw)
{
maxw=tw;
for(int j=1;j<=n;j++)
{
x[j]=a[j];
}
}
}
else
{
if(tw+w[i]<=c1)
{
a[i]=1;
dfs(i+1,tw+w[i],a);
}
a[i]=0;
dfs(i+1,tw,a);
}
}
void dispasolution(int n)
{
for(int j=1;j<=n;j++)
{
if(x[j]==1)
printf("将第%d个箱子放在第一个船上\n",j);
else
printf("将第%d个箱子放在第二个船上\n",j);
}
}
int main()
{
int a[20];
scanf("%d",&n);
scanf("%d %d",&c1,&c2);
for(int i=1;i<=n;i++)
{
scanf("%d",&w[i]);
}
dfs(1,0,a);
int sum=0;
for(int j=1;j<=n;j++)
{
if(x[j]==0)
sum+=w[j];
}
if(sum<=c2)
{
dispasolution(n);
}
else
{
printf("没有合适的装载方案");
}
return 0;
}
迷宫问题
N皇后问题
#include<stdio.h>
#include<stdlib.h>
int q[20];
void dispasolution(int n)
{
for(int i=1;i<=n;i++)
{
printf("(%d,%d) ",i,q[i]);
}
printf("\n");
}
int place(int i)//放置第i行皇后
{
int j=1;
if(i==1)
return 1;
while(j<i)//j=1---i-1为已放置的皇后
{
if(q[j]==q[i]||(abs(q[j]-q[i])==abs(j-i)))
return 0;
j++;
}
return 1;
}
void queens(int n)
{
int i=1;
q[i]=0;
while(i>=1)
{
q[i]++;
while(q[i]<=n&&!place(i))
{
q[i]++;
}
if(q[i]<=n)
{
if(q[i]==n)
{
dispasolution(n);
}
else
{
i++;
q[i]=0;
}
}
else i--;
}
}
int main()
{
int n;
scanf("%d",&n);
queens(n);
return 0;
}
求解图的M着色问题
#include<stdio.h>
#include<string.h>
int n,k,m;
int a[20][20];
int x[20];
int cnt=0;
int same(int i)
{
for(int j=1;j<=n;j++)
{
if(a[i][j]==1&&x[i]==x[j])
return 0;
}
return 1;
}
void dfs(int i)
{
if(i>n)
cnt++;
else
{
for(int j=1;j<=m;j++)
{
x[i]=j;
if(same(i))
dfs(i+1);
x[i]=0;
}
}
}
int main()
{
int x,y;
scanf("%d%d%d",&n,&k,&m);
for(int j=1;j<=k;j++)
{
scanf("%d%d",&x,&y);
a[x][y]=1;
a[y][x]=1;
}
dfs(1);
if(cnt>0)
{
printf("%d",cnt);
}
else
printf("-1\n");
return 0;
}
最长连续子序列和
#include<stdio.h>
int main()
{
int n;
int num[1001];
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&num[i]);
}
int ans=num[0];
for(int i=1;i<n;i++)
{
if(num[i-1]>0)
{
num[i]+=num[i-1];
}
else
{
num[i]+=0;
}
if(num[i]>ans)
{
ans=num[i];
}
}
printf("%d\n",ans);
return 0;
}
活动安排(贪心算法)
#include<stdio.h>
#include<string.h>
int n;
int b[1001],e[1001];
int endcur;
int cnt;
int temp;
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d%d",&b[i],&e[i]);
}
for(int i=0;i<n;i++)
for(int j=i+1;j<n;j++)
{
if(e[i]>e[j])
{
temp=e[i];e[i]=e[j];e[j]=temp;
temp=b[i];b[i]=b[j];b[j]=temp;
}
}
endcur=e[0];
cnt=1;
for(int i=1;i<n;i++)
{
if(b[i]>=endcur)
{
endcur=e[i];
cnt++;
}
else
{
continue;
}
}
printf("%d\n",cnt);
return 0;
}