0
点赞
收藏
分享

微信扫一扫

1010:STAMPS

天使魔鬼 2022-03-12 阅读 53
//搜索,递归
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;

int stamps[30];
int result[4], curresult[4];
int goal;//顾客要求面值
int num;//邮票种类数
bool tied = false;//判断是否tie
int score = 0, curscore = 0;//分数
int cards = 0, curcards = 0;//邮票张数
int kinds[4];//类型
int kindsnum=0, curkindsnum = 0;//最优解中有多少邮票

//cur表示当前面值,index表示第几类邮票,最大num;curcards表示当前解中有多少张邮票
void DFS(int cur, int index, int curcards) {
	if ((curcards > 3) && cur != goal) return;//失败,剪枝
	if (cur == goal) {//成功,打分
		curkindsnum = 1;
		for (int i = 1; i < curcards; i++) {
			if (kinds[i] != kinds[i - 1])
				curkindsnum++;
		}
		//规则:1.邮票种类多,2.张数最小,3.最大面额”最高,4.输出 “tie”
		curscore = curkindsnum * 100 + (4 - curcards) * 10 + stamps[index];
		if (curscore == score) {
			tied = true;
		}
		else if (curscore > score) {//更新最优解
			tied = false;
			score = curscore;
			cards = curcards;
			kindsnum = curkindsnum;
			for (int i = 0; i < 4; i++) {
				result[i] = curresult[i];
			}
		}
		return;
	}
	//i表示第几类邮票
	for (int i = index; i < num; i++) {
		if (cur + stamps[i] > goal) return;//剪枝
		//当前结果
		curresult[curcards] = stamps[i];
		kinds[curcards] = i;
		//递归
		DFS(cur + stamps[i], i, curcards + 1);
	}
	return;
}
//打印结果
void Print() {
	if (!result[0]) {
		cout << goal << " ---- none" << endl;
		return;
	}
	if (tied) {
		cout << goal << " (" << kindsnum << "): tie" << endl;
		return;
	}
	else
	{
		cout << goal << " (" << kindsnum << "): ";
		for (int i = 0; i < cards; i++)
			cout << result[i] << " ";
	}
	cout << endl;
}

int main() {
	while (true) {
		memset(stamps, 0, sizeof(stamps));
		num = 0;
		cin >> stamps[0];
		if (!stamps[0]) break;//输入0结束
		while (stamps[num]) {
			cin >> stamps[++num];
		}
		sort(stamps, stamps + num);//按面额排序

		while (true) {//依次处理每位客户
			memset(result, 0, sizeof(result));
			cin >> goal;
			if (goal == 0) break;
			if (goal > 4 * stamps[num - 1]) {
				cout << goal << " ---- none" << endl;
				continue;
			}
			score = 0;
			DFS(0, 0, 0);
			Print();
		}
	}
	return 0;
}
举报

相关推荐

0 条评论