首页 > 代码库 > 伪装,组合问题枚举
伪装,组合问题枚举
******************************先写第一个版本,假设手中的牌没有重复的*************************
#include<cstdio>#include<vector>#include<stack>#include<algorithm>using namespace std;#define MN 20#define MM 10int pai[MN+1];struct rst{ vector<int> data; void addElement(int &v_ele) { data.push_back(v_ele); } void print() { for (int i = 0; i < data.size(); i++) { if (i)printf(" "); printf("%d", data[i]); } }};struct rstSet{ vector<rst> data; void addRst(const rst &v_rst) { data.push_back(v_rst); } void clear() { data.clear(); } void addPreSet(rstSet v_preSet, int v_pai) { for each(const rst &singleRst in v_preSet.data) { rst newRst = singleRst; newRst.addElement(v_pai); data.push_back(newRst); } }};rstSet dp[MM][MN];void solve(int m,int n){ for (int j = 1; j < n; j++) { rstSet &theSet = dp[1][j]; theSet.clear(); rst newRst; newRst.addElement(pai[j]); theSet.addRst(newRst); dp[1][j] = theSet; } for (int i = 2; i <= m; i++) { for (int j = i; j <= n; j++) { rstSet &theSet = dp[i][j]; theSet.clear(); for (int k = i-1; k < j; k++) { theSet.addPreSet(dp[i - 1][k], pai[j]); } } } printf("答案:\n"); int cnt = 0; for (int i = m; i <= n; i++) { for (int j = 0; j < dp[m][i].data.size(); j++) { printf("#%d: ", ++cnt); dp[m][i].data[j].print(); printf("\n"); } }}int main(){ int m, n; while (~scanf("%d%d", &m, &n)) { for (int i = 1; i <= n; i++) { scanf("%d", &pai[i]); } sort(pai, pai + n); solve(m, n); } return 0;}/*3 51 2 3 4 55 101 2 3 4 5 6 7 8 9 10*/
伪装,组合问题枚举
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。