PAT | T1021 Safe Fruit

最后两个点超时了。。26分

#include 
#include 
#include 
#include 
#include 

using namespace std;

struct Fruit{
	int id,price;
	Fruit(){}
	Fruit(int i,int p):id(i),price(p){}
};

unordered_set<int> unsafe[1000];
vector<Fruit> basket;
unordered_set<int> curBasket; // 目前选好水果的编号

int n,m;
int minPrice = INT_MAX;
int maxSize = 0;
int curSize = 0;
int curPrice = 0;
vector<int> finalBasket;

void dfs(int x){ // 从basket的第i个水果开始遍历
	if(x == basket.size()){
		if(curSize > maxSize){
			maxSize = curSize;
			minPrice = curPrice;
			finalBasket.clear();
			unordered_set<int>::iterator it = curBasket.begin();
			while(it != curBasket.end()){
				finalBasket.push_back(*it);
				it++;
			}
		}
		else if(curSize == maxSize && curPrice < minPrice){
			minPrice = curPrice;
			finalBasket.clear();
			unordered_set<int>::iterator it = curBasket.begin();
			while(it != curBasket.end()){
				finalBasket.push_back(*it);
				it++;
			}
		}
		return;
	}
	unordered_set<int>::iterator it = unsafe[basket[x].id].begin();
	bool ins = true;
	while(it != unsafe[basket[x].id].end()){ // 看目前选好的水果里有没有和x相克的
		if(curBasket.find(*it) != curBasket.end()){ // 不能选这个水果
			ins = false;
			break;
		}
		it++;
	}
	if(ins && curSize + n - x >= maxSize){ // 可以选这个水果
		curSize++;
		curPrice += basket[x].price;
		curBasket.insert(basket[x].id);
		dfs(x + 1);
		curSize--;
		curPrice -= basket[x].price;
		curBasket.erase(basket[x].id);
	}
	dfs(x + 1);
}

int main(){
	scanf("%d%d",&n,&m);
	for(int i = 0;i < n;i++){
		int u,v;
		scanf("%d%d",&u,&v);
		unsafe[u].insert(v);
		unsafe[v].insert(u);
	}
	for(int i = 0;i < m;i++){
		int id,price;
		char c;
		scanf("%d%c",&id,&c);
		if(c == ' '){
			scanf("%d",&price);
			basket.push_back(Fruit(id,price));
		}
	}
	dfs(0);
	sort(finalBasket.begin(),finalBasket.end());
	printf("%d\n",maxSize);
	for(int i = 0;i < maxSize;i++){
		printf("%03d",finalBasket[i]);
		if(i != maxSize - 1) printf(" ");
		else printf("\n");
	}
	printf("%d",minPrice);
	system("pause");
	return 0;
}

你可能感兴趣的:(PTA)