1.排列问题
将集合x的全排列记为Perm(x)。riPerm(x)表示在全排列Perm(x)前面加一个ri前缀。所以集合R的全排列递归的定义为:
if n=1 Perm(R) = (r) 其中r是集合R中的唯一的元素
if n>1 Perm(R) 由(r1)Perm(R1),(r2)Perm(R2),(r3)Perm(R3).。。。(rn)Perm(Rn);
import java.io.OutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.StringTokenizer;
import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.InputStream;
import java.util.*;
public class Main {
public static void main(String []args){
InputStream inputStream = System.in;
OutputStream outputStream = System.out;
InputReader in = new InputReader(inputStream);
PrintWriter out = new PrintWriter(outputStream);
Task solver=new Task();
solver.solve(1,in,out);
out.close();
}
static class Task{
public void solve(int testnumber,InputReader in,PrintWriter out){
int n = in.nextInt();
int [] list = new int [n];
for(int i=0;i<n;i++){
list[i]=i+1;
}
Perm(list,0,n-1,out);
}
private void Perm(int []list,int k,int m,PrintWriter out){
if(k==m){
for(int i=0;i<=m;i++){
out.print(list[i]+" ");
}
out.println("");
} else {
for(int i=k;i<=m;i++){
int t=list[k];
list[k]=list[i];
list[i]=t;
Perm(list,k+1,m,out);
t=list[k];
list[k]=list[i];
list[i]=t;
}
}
}
}
static class InputReader {
public BufferedReader reader;
public StringTokenizer tokenizer;
public InputReader(InputStream stream) {
reader = new BufferedReader(new InputStreamReader(stream), 32768);
tokenizer = null;
}
public String next() {
while (tokenizer == null || !tokenizer.hasMoreTokens()) {
try {
tokenizer = new StringTokenizer(reader.readLine());
} catch (IOException e) {
throw new RuntimeException(e);
}
}
return tokenizer.nextToken();
}
public int nextInt() {
return Integer.parseInt(next());
}
}
}
2.整数划分问题
将一个正整数表示成一系列正整数之和,
n = n1+n2+n3+n4+n5+….+nk(其中n1>=n2>=n3>=…..nk>=1,k>=1)
在正整数所有不同划分中,将最大加数n1不大于m的划分个数记为q(n,m),对q(n,m)建立递归关系
q(n,1) = 1,n>=1;
q(n,m)=q(n,n),m>=n;
q(n,n)=1+q(n,n-1)
q(n,m)=q(n,m-1)+q(n-m,m);
import java.io.OutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.StringTokenizer;
import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.InputStream;
import java.util.*;
public class Main {
public static void main(String []args){
InputStream inputStream = System.in;
OutputStream outputStream = System.out;
InputReader in = new InputReader(inputStream);
PrintWriter out = new PrintWriter(outputStream);
Task solver=new Task();
solver.solve(1,in,out);
out.close();
}
static class Task{
public void solve(int testnumber,InputReader in,PrintWriter out){
int n = in.nextInt();
out.println(q(n,n));
}
private int q(int n,int m){
if(n<1 || m<1){
return 0;
}
if((n==1) || (m==1)){
return 1;
}
if(n<m){
return q(n,n);
}
if(n==m){
return q(n,m-1)+1;
}
return q(n,m-1)+q(n-m,m);
}
}
static class InputReader {
public BufferedReader reader;
public StringTokenizer tokenizer;
public InputReader(InputStream stream) {
reader = new BufferedReader(new InputStreamReader(stream), 32768);
tokenizer = null;
}
public String next() {
while (tokenizer == null || !tokenizer.hasMoreTokens()) {
try {
tokenizer = new StringTokenizer(reader.readLine());
} catch (IOException e) {
throw new RuntimeException(e);
}
}
return tokenizer.nextToken();
}
public int nextInt() {
return Integer.parseInt(next());
}
}
}