//搜索,递归
#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;
}
1010:STAMPS
最新推荐文章于 2024-07-17 18:07:42 发布