1. Gunakan metode keadaan biner untuk mencari permutasi dan kombinasi. Metode ini relatif mudah dipahami, tetapi efisiensi pengoperasiannya tidak tinggi.
Copy kode kodenya sebagai berikut:
import java.util.Array;
//Gunakan algoritma biner untuk melakukan pengaturan penuh
//hitungan1:170187
//hitungan2:291656
tes kelas publik {
public static void main(String[] args) {
start panjang=Sistem.currentTimeMillis();
hitungan2();
long end=Sistem.currentTimeMillis();
System.out.println(akhir-mulai);
}
hitungan kekosongan statis pribadi2(){
int[] angka=int baru []{1,2,3,4,5,6,7,8,9};
for(int i=1;i<Matematika.pow(9, 9);i++){
String str=Bilangan Bulat.toString(i,9);
int sz=str.panjang();
untuk(int j=0;j<9-sz;j++){
str="0"+str;
}
char[] temp=str.toCharArray();
Array.sort(temp);
String gl=String baru(temp);
if(!gl.sama dengan("012345678")){
melanjutkan;
}
Hasil string="";
untuk(int m=0;m<str.panjang();m++){
hasil+=angka[Bilangan Bulat.parseInt(str.charAt(m)+"")];
}
System.out.println(hasil);
}
}
jumlah kekosongan statis publik1(){
int[] angka=int baru []{1,2,3,4,5,6,7,8,9};
int[] ss=int baru []{0,1,2,3,4,5,6,7,8};
int[] temp=int baru[9];
sementara(suhu[0]<9){
temp[temp.length-1]++;
for(int i=temp.panjang-1;i>0;i--){
jika(suhu[i]==9){
suhu[i]=0;
suhu[i-1]++;
}
}
int []tt=temp.klon();
Array.sort(tt);
if(!Arrays.equals(tt,ss)){
melanjutkan;
}
Hasil string="";
for(int i=0;i<angka.panjang;i++){
hasil+=angka[temp[i]];
}
System.out.println(hasil);
}
}
}
2. Gunakan pemikiran rekursif untuk menemukan permutasi dan kombinasi, yang memerlukan kode dalam jumlah besar.
Copy kode kodenya sebagai berikut:
latihan paket;
impor java.util.ArrayList;
impor java.util.List;
kelas publik Tes1 {
/**
* @param argumen
*/
public static void main(String[] args) {
// TODO Stub metode yang dibuat secara otomatis
Objek[] tmp={1,2,3,4,5,6};
// Daftar Array<Objek[]> rs=RandomC(tmp);
Daftar Array<Objek[]> rs=cmn(tmp,3);
untuk(int i=0;i<rs.size();i++)
{
// Sistem.keluar.cetak(i+"=");
untuk(int j=0;j<rs.get(i).panjang;j++)
{
Sistem.keluar.cetak(rs.get(i)[j]+",");
}
Sistem.keluar.println();
}
}
// Temukan kombinasi array apa pun
ArrayList statis<Objek[]> RandomC(Objek[] sumber)
{
Daftar Array<Objek[]> hasil=Daftar Array baru<Objek[]>();
if(sumber.panjang==1)
{
hasil.tambahkan(sumber);
}
kalau tidak
{
Objek[] psource=Objek baru[sumber.panjang-1];
for(int i=0;i<psource.panjang;i++)
{
psumber[i]=sumber[i];
}
hasil=RandomC(psource);
int len=result.size();//Panjang kombinasi fn
hasil.tambahkan((Objek baru[]{sumber[sumber.panjang-1]}));
untuk(int i=0;i<len;i++)
{
Objek[] tmp=Objek baru[hasil.get(i).panjang+1];
untuk(int j=0;j<tmp.panjang-1;j++)
{
tmp[j]=hasil.dapatkan(i)[j];
}
tmp[tmp.length-1]=sumber[sumber.panjang-1];
hasil.tambahkan(tmp);
}
}
hasil pengembalian;
}
Daftar Array statis<Objek[]> cmn(Objek[] sumber,int n)
{
Daftar Array<Objek[]> hasil=Daftar Array baru<Objek[]>();
jika(n==1)
{
for(int i=0;i<sumber.panjang;i++)
{
hasil.tambahkan(Objek baru[]{sumber[i]});
}
}
else if(sumber.panjang==n)
{
hasil.tambahkan(sumber);
}
kalau tidak
{
Objek[] psource=Objek baru[sumber.panjang-1];
for(int i=0;i<psource.panjang;i++)
{
psumber[i]=sumber[i];
}
hasil=cmn(psource,n);
ArrayList<Objek[]> tmp=cmn(psource,n-1);
untuk(int i=0;i<tmp.ukuran();i++)
{
Objek[] rs=Objek baru[n];
untuk(int j=0;j<n-1;j++)
{
rs[j]=tmp.get(i)[j];
}
rs[n-1]=sumber[sumber.panjang-1];
hasil.tambahkan(rs);
}
}
hasil pengembalian;
}
}
3. Gunakan ide pemrograman dinamis untuk mencari permutasi dan kombinasi
Copy kode kodenya sebagai berikut:
paket Acm;
//Pencarian hebat untuk nomor kombinasi
Aplikasi Utama kelas publik {
public static void main(String[] args) {
int[] angka=int baru[]{1,2,3,4,5};
Tali str="";
//Mencari banyaknya kombinasi dari 3 angka
// hitungan(0,str,angka,3);
// Temukan banyaknya kombinasi 1-n angka
hitungan1(0,str,angka);
}
private static void count1(int i, String str, int[] num) {
if(i==angka.panjang){
Sistem.keluar.println(str);
kembali;
}
hitungan1(i+1,str,angka);
hitungan1(i+1,str+angka[i]+",",angka);
}
jumlah kekosongan statis pribadi(int i, String str, int[] num,int n) {
jika(n==0){
Sistem.keluar.println(str);
kembali;
}
if(i==angka.panjang){
kembali;
}
hitung(i+1,str+angka[i]+",",angka,n-1);
hitungan(i+1,str,angka,n);
}
}
Berikut susunannya
Copy kode kodenya sebagai berikut:
paket Acm;
//Temukan susunannya, temukan susunannya setelah berbagai permutasi atau kombinasi
import java.util.Array;
impor java.util.Scanner;
Demo kelas publik19 {
boolean statis pribadi f[];
public static void main(String[] args) {
Pemindai sc=Pemindai baru(Sistem.dalam);
int sz=sc.nextInt();
untuk(int i=0;i<sz;i++){
int jumlah=sc.nextInt();
f=boolean baru[jumlah];
Array.isi(f, benar);
int[] angka=int baru[jumlah];
untuk(int j=0;j<jumlah;j++){
bilangan[j]=j+1;
}
int nn=sc.nextInt();
Tali str="";
hitungan(angka,str,nn);
}
}
/**
*
* @param num mewakili array yang akan disusun
* @param str String tersusun
* @param nn Jumlah sisa item yang perlu disusun. Jika diperlukan penataan penuh, nn adalah panjang array.
*/
jumlah kekosongan statis pribadi(int[] angka, String str, int nn) {
jika(nn==0){
Sistem.keluar.println(str);
kembali;
}
for(int i=0;i<angka.panjang;i++){
jika(!f[i]){
melanjutkan;
}
f[i]=salah;
hitungan(angka,str+angka[i],nn-1);
f[i]=benar;
}
}
}