整数分解为若干项之和
#include <stdio.h>
int n;
int arr[100];
int sum=0,cnt=0,top=-1;
void dfs(int i){
if(sum==n){
cnt++;
printf("%d=",n);
for(int k=0;k<top;k++)
printf("%d+",arr[k]);
if(cnt%4==0||arr[top]==n)
printf("%d\n",arr[top]);
else printf("%d;",arr[top]);
}
if(sum>n)
return ;
for(int j=i;j<=n;j++){
arr[++top]=j;
sum+=j;
dfs(j);
sum-=j;
top--;
}
}
int main(){
scanf("%d",&n);
dfs(1);
}
0/1背包问题
#include <stdio.h>
#include <string.h>
#include <iostream>
#define MAXN 20
using namespace std;
int n;
int W;
int w[MAXN]={0};
int v[MAXN]={0};
int x[MAXN];
int maxv;
void dfs(int i,int tw,int tv,int rw,int op[]);
void dispasolution()
{ int i;
for (i=1;i<=n;i++)
if (x[i]==1)
printf("%d ",i);
printf("\n%d %d",W,maxv);
}
int main()
{
int i;
cin>>n>>W;
for(int i=1;i<=n;i++)
cin>>w[i]>>v[i];
int op[MAXN];
memset(op,0,sizeof(op));
int rw=0;
for (int i=1;i<=n;i++)
rw+=w[i];
dfs(1,0,0,rw,op);
dispasolution();
return 0;
}
void dfs(int i,int tw,int tv, int rw,int op[]){
if(i>n){
if(tv>maxv&&tw==W){
maxv=tv;
for(int j=1;j<=n;j++)
x[j]=op[j];
}
}
else {
for(int j=0;j<=1;j++){
op[i]=j;
if(tw+op[i]*w[i]<=W){
tw+=w[i]*op[i];
tv+=v[i]*op[i];
dfs(i+1,tw,tv,rw,op);
tw-=w[i]*op[i];
tv-=v[i]*op[i];
}
}
}
}
n皇后问题
#include <stdio.h>
#include <stdlib.h>
#define N 20
int q[N];
void dispasolution(int n)
{
for (int i=1;i<=n;i++)
printf("(%d,%d)",i,q[i]);
printf("\n");
}
bool place(int i,int j)
{
if (i==1) return true;
int k=1;
while (k<i)
{ if ((q[k]==j) || (abs(q[k]-j)==abs(i-k)))
return false;
k++;
}
return true;
}
void queen(int i,int n);
int main()
{ int n;
scanf("%d",&n);
if (n<=20)
queen(1,n);
return 0;
}
void queen(int i,int n){
if(i>n){
dispasolution(n);
return ;
}
else {
for(int j=1;j<=n;j++){
q[i]=j;
if(place(i,j)){
queen(i+1,n);
q[i]=0;
}
}
}
}
输出全排列
#include<stdio.h>
int a[11],b[11]={0};
void Print(int a[],int n){
for(int i=1;i<=n;i++){
printf("%d",a[i]);
}
putchar('\n');
}
void dfs(int step,int n){
if(step>n){
Print(a,n);
return ;
}
for(int j=1;j<=n;j++){
if(b[j]!=1){
b[j]=1;
a[step]=j;
dfs(step+1,n);
a[step]=0;
b[j]=0;
}
}
}
int main(){
int n;
scanf("%d",&n);
dfs(1,n);
}