越改越离谱了,一个RE,四个WA,求调!
查看原帖
越改越离谱了,一个RE,四个WA,求调!
638272
thehanged楼主2024/5/23 11:09

之前的代码,超时一个

#include <iostream>
using namespace std;

const int N = 50;
int v[N], g[N][N], path[N], ans[N];
// path 在搜索过程中保存下来的选择
int n, p, minn = 1e9;

bool check(int s){
	for(int i = 1; i <= n; ++ i){
		int sum = 0;
		for(int j = 1; j <= p; ++ j){
			sum += g[path[j]][i];
		}
		if(sum < v[i]) return false;
	}
	return true;
}

void dfs(int x, int s){ // s是目前选了多少个
	if(x > n){
		if(check(s)){
			// 更新最优解
			if(s < minn){
				minn = s;
				for(int i = 1; i <= minn; ++ i)
					ans[i] = path[i];
			}
		}
		return ;
	}
	// 选
	path[s + 1] = x;
	dfs(x + 1, s + 1);
	path[s + 1] = 0; // 回溯
	// 不选
	dfs(x + 1, s);
	return ;
}

int main(){
	cin >> n;
	for(int i = 1; i <= n; ++ i) cin >> v[i];
	cin >> p;
	for(int i = 1; i <= p; ++ i)
		for(int j = 1; j <= n; ++ j)
			cin >> g[i][j];

	dfs(1, 0);

	cout << minn << " ";
	for(int i = 1; i <= minn; ++ i)
		cout << ans[i] << " ";
	return 0;
}

想着优化一下,结果更离谱了

#include <iostream>
using namespace std;

const int N = 30;
int v[N], g[N][N], path[N], ans[N];
// path 在搜索过程中保存下来的选择
int n, p, minn = 1e9;

bool check(int s){
	for(int i = 1; i <= n; ++ i){
		int sum = 0;
		for(int j = 1; j <= p; ++ j){
			sum += g[path[j]][i];
		}
		if(sum < v[i]) return false;
	}
	return true;
}

void dfs(int x, int s){ // s是目前选了多少个
	if(check(s)){
		if(x > p){
			// 更新最优解
			if(s < minn){
				minn = s;
				for(int i = 1; i <= minn; ++ i)
					ans[i] = path[i];
			}
		}
		return ;
	}
	if(x > p) return ;
	// 选
	path[s + 1] = x;
	dfs(x + 1, s + 1);
	path[s + 1] = 0;
	// 不选
	dfs(x + 1, s);
}

int main(){
	cin >> n;
	for(int i = 1; i <= n; ++ i) cin >> v[i];
	cin >> p;
	for(int i = 1; i <= p; ++ i)
		for(int j = 1; j <= n; ++ j)
			cin >> g[i][j];

	dfs(1, 0);

	cout << minn << " ";
	for(int i = 1; i <= minn; ++ i)
		cout << ans[i] << " ";
	return 0;
}
2024/5/23 11:09
加载中...