伪装,组合问题枚举

******************************先写第一个版本,假设手中的牌没有重复的*************************

#include<cstdio>
#include<vector>
#include<stack>
#include<algorithm>

using namespace std;

#define    MN 20
#define MM 10
int 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 5
1 2 3 4 5
5 10
1 2 3 4 5 6 7 8 9 10

*/
时间: 2024-11-05 13:28:14

伪装,组合问题枚举的相关文章

LA 7360 Run Step (排列组合,枚举)

题意:给定一个数 n ,表示一共有 n 步,然后你可以迈一步也可以迈两步,但是左腿和右腿的一步和两步数要一样,并且两步数不小于一步数,问你有多少种方式. 析:虽然是排列组合,但还是不会做.....水啊. 思路是先分开算,先算左腿的,再算右腿的,对左腿先枚举2步的,然后再算一步的,主要是这个怎么算,我就迷茫了,.... 其实并不难,我们先假设左腿有 i 个1步的和 j 个两步的,那么组合数有多少呢?很明显么,就是C(i+j, i)么,就是找 i 位置给 i. 那么剩下的就简单了. 代码如下: #p

简单的排列组合-使用枚举

有五种颜色,每次取出三种,要求颜色无重复 1 #include<stdio.h> 2 3 int main(void) 4 { 5 enum color{blue,red,yellow,purple,black}; 6 enum color i,j,k,pri; 7 8 int n,loop; 9 n=0; 10 11 for(i=blue;i<=black;++i) 12 { 13 for(j=blue;j<=black;++j) 14 { 15 if(i!=j) 16 { 17

C#里面的枚举与位或运算符 一个枚举变量存入多个值

以前我们如果定义一个枚举类型 ,然后定义一个枚举变量,那么这个枚举变量只能为类型中的一个值,现在我们想要一个变量能够代表多个值: 今天看<Pro Net 2.0 Windows Forms And Custom Cortrols In C#>时看到枚举一节,发现了在一个枚举里面需要合并多个值,看到了用到了”|”运算符,原来没怎么注意,今天想了一下为什么用”|”呢?在MSDN里面看到了这样一句话:“用2的幂(即 1.2.4.8 等)定义枚举常量.这意味着组合的枚举常量中的各个标志都不重叠.”于是

枚举类型与位运算

目录 枚举 位运算 一.枚举 枚举类型是名称与值的组合. 枚举类型是值类型. 1.为什么枚举类型是名称与值得组合?有时我只看到键名称,没有看到相对的值. public enum Options { Insert, Update, Save, Delete, Query } 编译器会给上面补充完整 public enum Options { Insert=0, Update=1, Save=2, Delete=3, Query=4 } 默认从0开始,依次赋值. 2.为什么枚举类型是值类型 因为Sy

Objective-C枚举的几种定义方式与使用

假设我们需要表示网络连接状态,可以用下列枚举表示: enum CSConnectionState { CSConnectionStateDisconnected, CSConnectionStateConnecting, CSConnectionStateConnected, }; 然而定义枚举变量的方式却太不简介,要依如些语法编写: enum CSConnectionState state = CSConnectionStateDisconnected; 若是每次不用敲入 enum 而只需写

排列组合的实现

数据库环境:SQL SERVER2008R2 先说一下需求:实现1,2,3的排列组合,即123,132,213,231,312,321. 哈哈,你没看错,需求这是这么短短的一句话. 我想到了2个方法,都可以实现需求.下面我分别介绍这2种实现方法. 方法一:建一个表xx,往xx表中插入1,2,3自然数列,简单起见,把自然数改成字符串, 然后xx表和xx表进行FULL JOIN(全外连接)得到结果集tmp,结果集tmp再和xx表进行LEFT JOIN(左连接), 关联的条件是当前xx表的数据不存在结

poj—1753 (DFS+枚举)

Flip Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 51056   Accepted: 21551 Description Flip game is played on a rectangular 4x4 field with two-sided pieces placed on each of its 16 squares. One side of each piece is white and the

Bullcow 牡牛和牝牛(bzoj 3398)

Description 约翰要带N(1≤N≤100000)只牛去参加集会里的展示活动,这些牛可以是牡牛,也可以是牝牛.牛们要站成一排.但是牡牛是好斗的,为了避免牡牛闹出乱子,约翰决定任意两只牡牛之间至少要有K(O≤K<N)只牝牛. 请计算一共有多少种排队的方法.所有牡牛可以看成是相同的,所有牝牛也一样.答案对5000011取模 Input 一行,输入两个整数N和K. Output 一个整数,表示排队的方法数. Sample Input 4 2 Sample Output 6 样例说明 6种方法分

【CJ】APAC_RoundA

今天一天跟女神学姐一起打了一场APAC_RoundA, 做了AB, 还有CD的小数据. 还有晴神的友情帮助和营养毒奶. D其实是比较简单的,分很多,应该说是性价比最高的题目,没有抓住. B题枚举水位的高度,然后搜出联通块,涨水. C题我还是不怎么确定,不知道为啥裸牛顿就能过大数据,这题挺二的. D题是一个比较巧妙的题目,一下卡住了,其实只要枚举所有选的8个牌,然后分成两组,把两组可能的组合都枚举出来,然后按照花费排序,保证能获得的攻击力也单调递增. 然后把两个单调队列比对一下就行了,很快. 什么