【前言】
在这里感谢学长长的无私教诲,帮我理清思路和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);
}
}