1010:STAMPS

//搜索,递归
#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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
stamps 4.1 是一个邮票收集和管理软件,它提供了方便的方式来记录和管理邮票收藏。 使用stamps 4.1,用户可以创建一个个人邮票收藏库,将自己的邮票收藏组织起来。它提供了一个直观易用的界面,让用户可以轻松添加、编辑和删除邮票记录。用户可以为每张邮票输入的详细信息,如邮票的国家、年份、面值、设计和特点等,以便更好地了解每张邮票的背景和重要性。 除了记录邮票的基本信息,stamps 4.1 还提供了一些高级功能,以便用户更好地管理邮票收藏。例如,用户可以添加自定义标签和分类来组织邮票,方便快速检索和浏览。另外,用户还可以将邮票按照不同的主题、系列或分类进行组织,以便更好地展示和分享邮票收藏。通过图片导入功能,用户可以将自己的邮票图像直接导入软件,并与邮票记录相关联,以便更直观地浏览和展示。 stamps 4.1 还提供了打印和导出功能,用户可以打印自己的邮票收藏清单,或者导出邮票记录到Excel或其他文件格式中,以便与他人分享或备份。此外,软件还自带了一个内置的搜索功能,用户可以根据关键词快速搜索某张特定的邮票,方便用户在大规模邮票收藏中迅速定位。 总而言之,stamps 4.1 是一个实用且功能强大的邮票收集和管理软件,它可帮助用户轻松组织、浏览和管理自己的邮票收藏,以更好地了解和欣赏自己的邮票收藏。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值