• 组合之01转换法


    m个数中取n个数的所有组合问题

    从左到右扫描数组元素值的“10”组合,找到第一个“10”组合后将其变为“01”组合,同时将其左边的所有“1”全部移动到数组的最左端

    代码如下:

    #include <iostream>
    
    using namespace std;
    
    #define SIZE 100
    
    struct data{
    	int elem;
    	int b;
    };
    
    inline void move(data tmp[], int num, int r){
    	for(int i = 0; i < num; i++){
    		tmp[i].b = 1;
    	}
    	for(int j = num; j < r; j++){
    		tmp[j].b = 0;
    	}
    }
    
    inline void println(data tmp[], int len){
    	for(int i = 0; i < len; i++){
    		if(tmp[i].b == 1)
    			cout << tmp[i].elem << " ";
    	}
    	cout << endl;
    }
    
    void comb(int arr[], int len, int count){
    	data tmp[SIZE];
    
    	for(int i = 0; i < len; i++){
    		tmp[i].elem = arr[i];
    		if(i < count){
    			tmp[i].b = 1;
    		}
    		else{
    			tmp[i].b = 0;
    		}
    	}
    	println(tmp, len);
    
    	while(true){
    		int j = 0;
    		int num = 0;
    		while(j+1 < len){
    			if(tmp[j].b == 1){
    				num++;
    				if(tmp[j+1].b == 0){
    					tmp[j].b = 0;
    					tmp[j+1].b = 1;
    					move(tmp, num-1, j);
    					break;
    				}
    			}
    			++j;	
    		}
    		if(j+1 < len)
    			println(tmp, len);
    		else
    			break;
    	}
    }
    
    int main(int argc, char* argv[])
    {
    	int testArr[] = {2, 5, 1, 7, 4};
    	int len  = sizeof(testArr)/sizeof(int);
    
    	comb(testArr, len, 3);
    
    	return 0;
    }
    


     

  • 相关阅读:
    day03
    day02
    day01
    springBoot相关(二)
    predis操作redis方法大全
    按钮变色变色变色
    mysql中获取一天、一周、一月时间数据的各种sql语句写
    wordpress速度慢
    html关于强制显示、隐藏浏览器的滚动条
    css全局样式表
  • 原文地址:https://www.cnblogs.com/riasky/p/3507430.html
Copyright © 2020-2023  润新知