T了俩点,求助
查看原帖
T了俩点,求助
91975
GVNDN楼主2020/7/3 21:20

还有哪可以优化优化的?(这题数据这么水还t了。。。我太菜了)

#include<iostream>
#include<cstring>
using namespace std;

int a[30], b[30], c[20][30], res1[20], res2[20], v, g, ans1 = 0, ans2 = 0, f = 1;
//a:标准 b:实际 c:食品参数 res1:上一个最佳答案 res2:本次搜索得到的最佳答案 f:输出标记 
bool d[20];
//d:食品标记 

void print(){
	for(int i = 0; i <= res1[0]; i++){
		if(!f) cout << " ";
		else f = 0;
		cout << res1[i];
	}
}

int pd(){
	for(int i = 1; i <= v; i++)
		if(b[i] < a[i]) return 0;
	return 1;
}

void dfs(int k){
	for(int i = 1; i <= g; i++){
		if(!d[i]){
			d[i] = 1;
			ans2++;
			res2[k] = i;
			for(int j = 1; j <= v; j++)    //计算 
				b[j] += c[i][j];
			if(pd()){
				if(ans2 < ans1 || ans1 == 0){
					memcpy(res1, res2, sizeof(res1));
					ans1 = ans2;
					res1[0] = ans1;
				} 
			}
			else
				dfs(k + 1);
			d[i] = 0;
			ans2--;
			res2[k] = 0;
			for(int j = 1; j <= v; j++) 
				b[j] -= c[i][j];
		}
	}
}				

int main(){
	cin >> v;
	for(int i = 1; i <= v; i++)
		cin >> a[i];
	cin >> g;
	for(int i = 1; i <= g; i++)
		for(int j = 1; j <= v; j++)
			cin >> c[i][j];
//	for(int i = 1; i <= g; i++){
//		cout << i;
//		for(int j = 1; j <= v; j++)
//			cout << " " << c[i][j];
//		cout << endl;
//	}	
	dfs(1);
	print();
	return 0;
}
2020/7/3 21:20
加载中...