• 不重复的组合


    输入n个数,求这n个数构成的集合的所有子集,不允许输出重复的项

    输入

    3

    1 1 3

    输出

    1

    1 1

    1 1 3

    1 3

    3

    代码:

    #include<cstdio>
    #include<cstring>
    using namespace std;
    const int maxn = 100;
    int rcd[maxn],num[maxn],vis[maxn];
    int n,m;
    int read_input()
    {
        if(scanf("%d",&n)==EOF)
            return 0;
        m=0;
        memset(vis,0,sizeof(vis));
        int i,j;
        for( i=0;i<n;i++){
            int val;
            scanf("%d",&val);
            for( j=0;j<m;j++)
                if(num[j]==val){
                    vis[j]++;
                    break;
                }
            if(j==m){
                num[j]=val;
                vis[m++]++;
            }
    
        }
        return 1;
    }
    void unrepeat(int l,int p){
    
    
        for(int i=0;i<l;i++){
            printf("%d",rcd[i]);
            if(i<l-1)
                printf(" ");
        }
        printf("
    ");
    
        for(int i=p;i<m;i++)
            if(vis[i]>0){
                vis[i]--;
                rcd[l]=num[i];
                unrepeat(l+1,i);
                vis[i]++;
            }
    
    }
    int main(){
        while(read_input())
            unrepeat(0,0);
    
        return 0;
    }
    

      引用别人说的话:“搜索问题中很多本质上是排列组合问题,只不过加上了某些剪枝和限制条件,解这类题的基本算法框架常常是类循环排列,劝排列,一般组合或者全组合,而不重复排列和不重复组合则是两种非常有效的剪枝技巧”

    Knowing others is intelligence; Knowing yourself is true wisdom
  • 相关阅读:
    实用的 jquery 弹出窗口 插件winbox
    软考大纲
    那些年踩过三轮车的程序员
    今天是周几?
    本故事荣获2011年度最佳故事情节奖.
    命令行修改linux时间
    [置顶] 自考,认证相关资料
    金山软件面试题
    del
    【转】数据结构:位图法
  • 原文地址:https://www.cnblogs.com/huicpc0212/p/4185979.html
Copyright © 2020-2023  润新知