前段时间的东西了,拿出来见见光。
模拟大数加法,按字典序生成 n 元集合上或多重集的全部 k-组合。
n元集合 k- 组合
#include<iostream> #define SIZE 10000 using namespace std; int a[SIZE]={0}; bool check(int a[],int k,int n) { for(int i=0;k-i>0;i++) { if(a[i]<n-k+i) return true; } return false; } void addition(int a[],int k,int n,int x) { while(++a[x]>=n) { addition(a,k,n,x-1); a[x]=a[x-1]; } } bool next_combination(int a[],int k,int n) { if(check(a,k,n)==false) return false; else { addition(a,k,n,k-1); return true; } } void printInfo(int a[],int k) { for(int i=0;k-i>0;i++) { cout<<a[i]<<" "; } cout<<endl; } void Init(int a[],int k) { for(int i=0;k-i>0;i++) { a[i]=i+1; } } int main() { Init(a,3); do { printInfo(a,3); } while(next_combination(a,3,10)); system("pause"); return 0; }
n元多重集 k-组合
#include<iostream> #define SIZE 10000 using namespace std; int a[SIZE]={0}; bool check(int a[],int k,int n) { for(int i=0;k-i>0;i++) { if(a[i]<n-1) return true; } return false; } void addition(int a[],int k,int n,int x) { if(++a[x]>=n) { addition(a,k,n,x-1); a[x]-=n; } } bool next_combination(int a[],int k,int n) { if(check(a,k,n)==false) return false; else { addition(a,k,n,k-1); return true; } } void printInfo(int a[],int k) { for(int i=0;k-i>0;i++) { cout<<a[i]<<" "; } cout<<endl; } void Init(int a[],int k) { for(int i=0;k-i>0;i++) { a[i]=0; } } int main() { Init(a,3); do { printInfo(a,3); } while(next_combination(a,3,10)); system("pause"); return 0; }
k-组合生成算法
最新推荐文章于 2024-09-14 22:25:23 发布