用1元,2元,5元,10元,20元,50元组合成100元

100元换零钱1元,2元,5元,10元,20元,50元有多少种组合方案


一道笔试题,当时就懵逼了。。。
找到递推公式之后,其实也不难

F(N,M)=F(N,M-1)+F(N-VAL[M],M)

F(N,M)表示 用不超过第M个值的数来表示N 的所有组合方案
举个栗子
我们先看4的组成
4 = 2+2 = 2+1+1 = 1+1+1+1共3种方案
我们再看公式,例如
F(4,6) = F(4,5) + F(4-VAL[6],6) 
= F(4,5) + F(4-50,6)
= F(4,5) + F(-46,6)
= F(4,5)

F(4,5) = F(4,4) + F(4-VAL[5],5) 
= F(4,4) + F(4-20,5)
= F(4,4) + F(-16,5)
= F(4,4)

F(4,4) = F(4,3) + F(4-VAL[4],4) 
= F(4,3) + F(4-10,4)
= F(4,3) + F(-6,4)
= F(4,3)

F(4,3) = F(4,2) + F(4-VAL[3],3) 
= F(4,2) + F(4-5,3)
= F(4,2) + F(-1,3)
= F(4,2)

F(4,2)  = F(4,1) + F(4-VAL[2],2) 
    = F(4,1) + F(4-2,3)
= F(4,1) + F(2,3)
= F(4,1) + F(2,3)

F(4,6) 的所有组合方案其实就是F(4,2)的组合方案,毕竟VAL[3]~VAL[6]均大于4,不可能存在更多的组合方案,
所以,
用不超过第6个值的数(即50元)来表示4元 的所有组合方案【F(4,6)】
等于  用不超过第2个值的数(即2元)来表示4元 的所有组合方案【F(4,2)】
那么,
用不超过第2个值的数(即2元)来表示4元 的所有组合方案【F(4,2)】
又等于
用不超过第1个值的数(即1元)来表示4元 的所有组合方案 
加上 
用不超过第3个值的数(即5元)来表示2元 的所有组合方案【F(4,1)+F(2,3)】
明显F(4,1)所代表的方案就是4=1+1+1+1,即F(4,1)=1
而F(2,3)也可以用上述推导的方式,即F(2,3)=F(2,2)=F(2,1)+F(0,2)=....=F(2,1)+F(0,0)=2
F(0,0)可以理解成用0元来表示0元,这算是1种方案

此时我们就能看出4的组合方案,其实就是
4=2+2
4=2+1+1
【F(4-VAL[2],2),意味着把红色数字减去 ,即F(2,2)代表上面两种方案
4=1+1+1+1
【F(4,1)代表4=1+1+1+1方案】

代码如下:
int main()
{
	int val[7] = { 0,1,2,5,10,20,50 };
	int f[101][7];
	memset(f, 0, sizeof(f));

	for (int j = 0; j <= 6; j++)
		f[0][j] = 1;
	
	for (int j = 1; j <= 6; j++)
	{
		for (int i = 1; i <= 100; i++)
		{
			if (i - val[j] < 0)
				f[i][j] = f[i][j - 1];
			else
				f[i][j] = f[i - val[j]][j] + f[i][j - 1];
		}
	}


	//cout << test(0, 100) << endl;
	//cout << ans << endl;
	cout << f[100][6] << endl;
	system("pause");
	return 0;
}



根据引用\[1\]和引用\[2\]的代码,我们可以得出uniapp100转换成1的方案有多种。其中一种方案是:10元有10张,20元有0张,50元有0张。这样的方案满足条件,将100转换成了10张1。根据引用\[2\]的代码,我们可以得出一共有101种组合方案。所以uniapp100转换成1的方案有101种。 #### 引用[.reference_title] - *1* [Q17:Java把十人民币换成零钱,(12元,5),有多少种兑换方法](https://blog.csdn.net/xavvgu/article/details/109166909)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [100块钱兑换成102050(Java)](https://blog.csdn.net/qq_44534541/article/details/109529410)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [将小程序代码转成uni-app代码](https://blog.csdn.net/shihuiyun/article/details/90256246)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值