合理分配 “锁”资源

问题描述:某部门要安装电子锁,要求在M个工作人员中每人发一张磁卡,卡上有解锁的磁条,为了确保安全,必须要N个人在一起才能将锁打开,输入M,N  求磁条最小方案。如:

样例输入:

5 3

样例输出:

0111000111
0011111010
1001011101
1100101011
1110110100

1代表能解开该处的磁条,0代表不能解开

今天晚上写的太累了,就不解释了,下次加上注释说明。直接上代码:

#include "iostream"
#include "string"
using namespace std;

bool fun(int num,int col){
	int a = 0;
	while(num>0){
		if(num%2==1) a++;
		num /= 2;
	}
	if(a==col) return true;
	return false;
}

string change(int num,int length){
	string result;
	while(num>0){
		int a = num%2 + '0';
		result.insert(0,1,(char)a);
		num/=2;
	}
	int t = length - result.size();
	result.insert(0,t,'0');
	return result;
}

int main(){
	int m,n;
	cin>>m>>n;
	int lock,openLock,closeLock;
	int t1 = 1,t2 = 1;
	for(int i=0;i<n-1;i++){
		t1 *= (m-i);
		t2 *= (i+1);
	}
	lock = t1/t2;
	int *p = new int[lock];
	int col = m-n+1;
	int temp = 0;
	for(int i=0;i<lock;i++){
		temp++;
		while(!fun(temp,col)){
			temp++;
		}
		p[i] = temp;
	}
	string *ps = new string[lock];
	for(int i=0;i<lock;i++){
		ps[i] = change(p[i],m);
	}
	
	for(int i=0;i<m;i++){
		for(int j=0;j<lock;j++){
			cout<<ps[j][i];
		}
		cout<<endl;
	}
}


原文地址:https://www.cnblogs.com/fuhaots2009/p/3478776.html