7-6 找零钱*** (20 分) (深搜)

收银员现有 n 张面值分别为 v​1​​ ,v​2​​ ,…,v​n​​ 的纸币。若找零金额为 m,则一共有多少种找零方法?

注:0

输入格式
n v​1​​ ,v​2​​ ,…,v​n​​ m

输出格式
若有解,则输出全部找零方案,每输出一种 若无解,则输出“None”

输入样例1
6
3 1 4 3 2 7
9
输出样例1
3 1 3 2
3 4 2
4 3 2
2 7
输入样例2
5
5 3 4 6 7
2
输出样例2
None

solution:

#include 
using namespace std;

int b[1024];
int a[1024];

int cnt, n, n_num, num, judge;

void Num(int i)
{
	int k, flag = 0;
	if (n_num < num)
	{
		for (;i < n; i++)
		{
			if (!b[i])
			{
				b[i] = 1;
				n_num += a[i];
				Num(i + 1);
				n_num -= a[i];
				b[i] = 0;
			}
		}
	}
	else if (n_num == num)
	{
		for (k = 0; k < n; k++)
		{
			if (b[k])
			{
				if (flag)
				{
					putchar(' ');
				}
				flag = 1;
				cout << a[k];
			}
		}
		putchar('\n');
		cnt++;
	}
}

int main()
{
	int i;
	cin >> n;
	for (i = 0; i < n; i++)
	{
		cin >> a[i];
	}
	cin >> num;
	Num(0);
	if (!cnt)
	{
		cout << "None" << endl;
	}
	return 0;
}

你可能感兴趣的:(深度优先搜索)