设为首页 加入收藏

TOP

ACM:回溯法,子集生成
2015-07-24 05:43:07 来源: 作者: 【 】 浏览:5
Tags:ACM 回溯 子集 生成

(一)增量构造法

#include 
  
   
#include 
   
     using namespace std; const int MAXN = 1000; int A[MAXN], n; void print_subset(int n, int *A, int cur) { for(int i = 0; i < cur; ++i) cout << A[i] << " "; cout << endl; int s = (cur ? A[cur-1]+1 : 0); //选取当前填到第cur个位置上的可以填的最小是数字! for(int i = s; i < n; ++i) { A[cur] = i; print_subset(n, A, cur+1); } } int main() { cin >> n; print_subset(n, A, 0); return 0; }
   
  

(二)位向量法

#include 
  
   
#include 
   
     using namespace std; const int MAXN = 1000; int B[MAXN], n; void print_subset(int n, int *B, int cur) { if(cur == n) { for(int i = 0; i < cur; ++i) { if(B[i]) cout << i << " "; } cout << endl; return ; } B[cur] = 1; //选第cur个元素 print_subset(n, B, cur+1); B[cur] = 0; //不选第cur个元素 print_subset(n, B, cur+1); } int main() { cin >> n; print_subset(n, B, 0); return 0; }
   
  
必须当“所有元素是否选择”全部确定完毕后才是一个完整的子集。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇NYOJ 264 国王的魔镜 下一篇boost中自动确定数据类型(BOOST_..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: