zcmu 1683 排列 + 1620 全排列 + 1711 背包(dfs)

【前言】

在这里感谢学长长的无私教诲,帮我理清思路和debug

【题目】

1683: 排列

Description

给你一个数,输出所有的排列

Input

一个数n

Output

看样例

Sample Input

2

Sample Output

1 2

2 1

 

【代码】

#include<bits/stdc++.h>
using namespace std;
int a[15],b[15],n;
void dfs(int x)
{
   int i;
   if(x==n+1)
   {
       printf("%d",a[1]);
       for(i=2;i<=n;i++)
          printf(" %d",a[i]);
        printf("\n");
        return;
   }
   for(i=1;i<=n;i++)
   {
       if(!b[i])
       {
           a[x]=i;
           b[i]=1;
           dfs(x+1);
           b[i]=0;
       }
   }
   return;
}
int main()
{
    while(~scanf("%d",&n))
         dfs(1);
    return 0;
}

【题目】

1620: 全排列

Description

给定n个数 a[0] , a[1] ........ a[n-1], 输出其全排列。

 

Input

第一行输入一个数n,(n<7)

接下来一行输入n个数。

 

Output

按字典序从小到大输出全排列

 

Sample Input

3

1 2 3

3

1 2 2

Sample Output

1 2 3

1 3 2

2 1 3

2 3 1

3 1 2

3 2 1

1 2 2

2 1 2

2 2 1 

 

【代码】

#include<bits/stdc++.h>
using namespace std;
int a[10],b[725][10],c[10],d[10],n,y;
void dfs(int x)
{
    int i,j;
    if(x==n+1)
    {
        for(i=1;i<=n;i++)
            b[y][i]=d[i];
        int f=1;
        for(i=1;i<y;i++)
        {
            for(j=1;j<=n;j++)
                if(b[i][j]!=b[y][j])
                    break;
            if(j==n+1)
            {
                f=0;
                break;
            }
        }
        if(f)
        {
            printf("%d",b[y][1]);
            for(i=2;i<=n;i++)
                printf(" %d",b[y][i]);
            printf("\n");
        }
        y++;
        return;
    }
    for(i=1;i<=n;i++)
    {
        if(!c[i])
       {
           d[x]=a[i];
           c[i]=1;
           dfs(x+1);
           c[i]=0;
       }
   }
   return;
}
int main()
{
    while(~scanf("%d",&n))
    {
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        sort(a+1,a+n+1);
        y=1;
        dfs(1);
    }
    return 0;
}

【题目】

1711: 背包

Description

你有一个神奇的背包,他的容积是m(0<m<=80),只有你装满他,你才能拿走他,现在给你n(1<=n<=20)个物品Xi(Xi<=m),那么一共有几种方式,可以让你拿走背包?

Input

第一行 n,m

第二行 n个数字

Output

输出方案数

Sample Input

3 40

20 20 20

Sample Output

3

 

【代码】

#include<bits/stdc++.h>
using namespace std;
int n,m,a[25],ans;
void dfs(int s,int k)
{
   int i;
   if(s==0)
   {
       ans++;
       return;
   }
   if(s<0||k>n)
      return;
   dfs(s-a[k],k+1);
   dfs(s,k+1);
   return;
}
int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        ans=0;
        dfs(m,1);
        printf("%d\n",ans);
    }
    return 0;
}

模板:

void dfs(int step)  
{  
     判断边界,return
     for(i=1;i<=n;i++)  尝试每一种可能 
     {  
         继续下一步dfs(step+1);  
     }  
}  

 


 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值