7-1 找零钱*** (20 分)

收银员现有 n 张面值分别为 v

的纸币。若找零金额为 m,则一共有多少种找零方法?

注:0<n≤1000,0<v
输入格式

输出格式
若有解,则输出全部找零方案,每输出一种 若无解,则输出“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

知识点:回溯,剪枝。

思路:本题为子集问题,(即可以分为选与不选两种情况,不需要用个for循环,直接在dfs中写出两种情况,在此基础上进行剪枝)dfs(i,sum,op)(i为第i个元素,sum为选中的元素和,op是数组用来标记第i个元素选不选)

纠正:刚开始在dfs中用for循环进行遍历访问,其实不用,因为该题为子集问题不需要,for一般用于全排列

代码:

#include<bits/stdc++.h>
using namespace std;
int n;
int rm = 0;
int op[1005];
int v[1005];
int m;
int flag = 0;
void dfs(int i,int sum,int cnt) {
	if (i>n) {
		if (sum == m) {
			flag = 1;
			int j = cnt;
			for (int k = 1;k <= n;k++) {
				if (j == 1 && op[k] == 1) {
					cout << v[k] << endl;
				}
				else if (op[k] == 1) {
					cout << v[k] << " ";
					j--;
				}
			}
		}
		return;
	}
	op[i] = 1;
	if(sum + v[i]<=m)
		dfs(i + 1, sum+v[i],cnt+1);
	op[i] = 0;
	dfs(i + 1, sum,cnt);
}
int main() {
	cin >> n;
	for (int i = 1;i <= n;i++) {
		cin >> v[i];
		rm += v[i];
	}
	cin >> m;
	dfs(1,0,0);
	if (flag == 0)
		cout << "None" << endl;
}
1. 首先需要一个输入框,用户可以在输入框中输入需要找零的金额。 2. 在程序中定义一个数组,存储钞票的面额。例如,[100, 50, 20, 10, 5, 1]。 3. 创建一个函数,接收用户输入的金额和钞票面额数组作为参数。 4. 在函数中,创建一个空数组,用于存储找零的最佳组合。 5. 使用一个循环,从大到小遍历钞票面额数组,对于每个面额,计算需要找零的数,然后将该面额和数存入最佳组合数组中。 6. 在计算数时,可以使用模运算得到余数,然后继续循环计算下一个面额的数,直到余数为0。 7. 最后返回最佳组合数组,显示给用户。 以下是一个示例代码: ```javascript function getChange(amount, denominations) { let result = []; for (let i = 0; i < denominations.length; i++) { let denomination = denominations[i]; let count = Math.floor(amount / denomination); if (count > 0) { result.push([denomination, count]); amount = amount % denomination; } } return result; } // 示例用法 let amount = 123; let denominations = [100, 50, 20, 10, 5, 1]; let change = getChange(amount, denominations); console.log(change); // 输出 [[100, 1], [20, 1], [1, 3]] ``` 在上面的示例代码中,getChange函数接收两个参数,别是需要找零的金额和钞票面额数组。函数中使用一个循环遍历钞票面额数组,对于每个面额,计算需要找零的数,并将该面额和数存入一个数组中。在计算数时,使用了Math.floor函数取整和模运算计算余数。最后返回找零的最佳组合数组。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值