90分,二进制分解求助!
查看原帖
90分,二进制分解求助!
804607
rainygame楼主2022/11/15 10:58

代码思路:

蒟蒻不会搜索,就用二进制分解的方法,枚举 ii 从 11 (至少有一个)到 2^g2 g ,然后每次对 ii 进行分解二进制并且判断合法,如果现在的长度最小,则储存,并保存字典序最小的。但不知为何 WA 了第 99 个点。

代码:

#include <bits/stdc++.h>
using namespace std;
#define KIND 26
#define FOOD 16

int v, g, length = INT_MAX, start, cnt;
int cneed[KIND], sum[KIND], food[FOOD][KIND];
vector<int> tim, minn;

bool check(){
	for (int i=1; i<=v; i++){
		if (sum[i] < cneed[i]) return false;
	}
	return true;
}

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	
	cin >> v;
	for (int i=1; i<=v; i++) cin >> cneed[i]; 
	
	cin >> g;
	for (int i=1; i<=g; i++){
		for (int j=1; j<=v; j++) cin >> food[i][j];
	}
		
	for (int i=1; i<=(1 << g); i++){
		memset(sum, 0, sizeof(sum));
		cnt = 0;
		tim.clear();
		
		for (int j=1; j<=g; j++){
			if (i/j&1){
				for (int k=1; k<=v; k++) sum[k] += food[j][k];
				cnt++;
				tim.push_back(j);
			}
		}
		
		if (check() && cnt < length){
			length = cnt;
			minn = tim;
			// cout << length << '\n';
		}
	}
	
	cout << length << ' ';
	for (int i=0; i<minn.size(); i++) cout << minn[i] << ' ';

	return 0;
}
2022/11/15 10:58
加载中...