回溯法/穷举n位2进制数全排列/求解0 1 背包问题/装载问题/迷宫问题/

回溯法是一种以深度优先搜索的方式系统的搜索问题的解

穷举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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值