题目地址:https://pintia.cn/problem-sets/994805148990160896/problems/994805155206119424
中文题目:
有一种不同颜色的珠子,可以串成一串,你想要一些珠子,需要去商店买,但是商店的珠子都是一串一串卖,你看中一个珠子,就要把整串都买下来。
你要从商店里面买珠子串,来凑成自己想要的珠子。如果商店能买到你想要的所有珠子,那么输出Yes,并输出你额外购买的珠子数;如果不能买到,那就输出No,并输出还差的珠子数
用26个大写字母,26个小写字母,0-9个数字,各表示不同的颜色的珠子。先输入一行你要的珠子串,再输入一行数字n,然后跟上n行,是商店所有的珠子串。
样例1:
输入:
RYg5
8
gY5Ybf
8R5
12346789
gRg8h
5Y37
pRgYgbR52
8Y
8g
输出:
Yes 3
样例2
输入:
YrRR8RRrY
3
ppRGrrYB225
8ppGrrB25
Zd6KrY
输出;
No 3
题解:
搜索: 深度搜索商店珠子串,将该珠子串加进来,如果收集到了所需要的所有珠子,则记录下来。
比较: 与想要的珠子作比较,不需要遍历它,只需要一个256长度的数组。数字,字母的ascii码都在256以内,把每个想要的珠子设为1,不想要的珠子设为0,在比较时,只要它为1,就是想要的珠子了。
初始化:还需要一个256长度的数组,假如需要2个珠子a,那么把 数组[a] 设置为2。也就是,如果需要n个这种珠子,就把它设置为n,如果不需要,就设为0.
加入: 搜索时,如果要把一个珠子加入,那么就在把刚初始化的数组里面,相应的数减一。
满足: 想知道是否已有所有需要的珠子,不需要遍历它,只要一个数值变量,初始化时,它是所有需要珠子的数字总和,每次加入一个珠子,如果该珠子是所需珠子,而且初始化的数组里它大于0,那么这个数值变量减一,当变量为0时,它就不能再减了,这时,说明所有需要的珠子都得到了。
回退: 加入珠子串后,如果不想要了,就要把它回退掉。先前初始化的数组里,要把这个珠子加一,如果加一之后大于0,那么判断满足的变量,也要加一。
额外: 在满足的时候,我们要查看额外的珠子数,并记录下最小的额外数。我们要用一个变量,每次加入额外珠子时,就加一,每次回退额外珠子时,就减一。
欠缺: 当拿了商店所有珠子串后,还不能满足时,就要输出缺少多少珠子,先前那个用来判断是否满足的数值变量,就是答案。
剪枝: 第一次深度搜索时,如果没有满足,会搜索商店里所有的珠子串,这时,就说明这个商店满足不了我们,我们可以直接输出no了。
最后放上我凌乱不堪的代码:
#include <iostream>
using namespace std;
int HashTable[301];
int TargetTable[301];
char target[1001];
char goods[100][1001];
int goodsnum=0;
int count=0;
int neg=0;
int minCount=999999