说明:第一版见:POJ 1010 - STAMPS + Python(DFS*)_xxdragon126的博客-CSDN博客
原题链接:1010 -- STAMPS
为了巩固该题目,现对其重做;重做之后发现,编程思想与之前有所不同。看来,在经过了一段刷题训练之后,编程逻辑也发生了变化。此方案是原方案的简化版。
一 问题描述
集邮者到邮局购买指定总额的邮票,银行根据总额需求,以实际库存派发邮票,并且一次最多派发4张。
邮票库存示例如下:
示例1:1 2 3;说名有三种邮票类型,其面值分别为1 2 3;每类最多4张
示例2: 1 1 ;说明有两种邮票类型,其面值均为1,;每类最多4张
输出:输出满足客户需求总额的邮票集合(输出格式:客户需求总额 (邮票种类):各张的面值)
关于输出方案的要求:
1 首先,邮票种类最多优先
2 其次,邮票张数最少优先
3 最后,最大面值更大者优先
4 否则,保存多套方案。
二 解题思路:
1. 将输入数据转化成矩阵:各行分别表示不同类别的邮票,每行共4个等值元素,该元素大小即为当前邮票的面值。因此,即使两张邮票面值相同时,而其行号不同,仍能够区分二者属于不同类别的邮票。
2. 一些终止原则
2.1 ## 如果可行方案中存在超过两个,则直接返回
2.2 ###当前待确定的方案超过四个元素,直接返回
2.3 # 当前待确定的方案等于四个元素,但部分和不等于目标总额,直接返回
2.4 # 当前待确定的方案部分和大于目标总额,则直接返回
三 代码实现
# https://blog.csdn.net/baoqiaoben/article/details/79844831
# https://exp-blog.com/algorithm/poj/poj1010-stamps/
# 20211227 重新写
import collections
#1 将数据转化为矩阵,获得矩阵元素索引
def sub2Dict(subData):
##
n = len(subData)
matric = []
for i in range(n):
temp = subData[i]
ma