动态规划打印最少硬币的组合


前言

硬币问题深入一波~


一、题目分析

在知道凑成总金额s所需的最少硬币数量后,想要打印此时硬币组合。
增加一个记录表Min_path[i],在进行对最少硬币数量打表的同时,记录每个金额 i 其组合的最后一枚硬币,即对于每一个总金额i,Min_path[i]用于存储其组合中最后一枚硬币,再通过总金额s-Min_path[i],可求出对于剩余金额的最少硬币组合中的最后一枚硬币,直到s=0,结束。
例:输入s=7
1)Min_path[7]=5 (输出一个5) s=s-Min_path[s]=7-5=2;
2)Min_path[2]=1 (输出一个1)s=s-Min_path[s]=2-1=1;
3)Min_path[1]=1 (输出一个1)s=s-Min_path[s]=1-1=0;
s==0,结束
(Min_path[s]对应的值,是在对最少硬币数量打表同时给出)

二、代码

#include<iostream>
#include<stdio.h>
using namespace std;

const int money=251;
const int value=5;
int type[value]={1,5,10,25,50};
int Min[money];
int Min_path[money]={0};

void solve(){
	for(int i=0;i<money;i++){
		Min[i]=INT_MAX;
	}
	Min[0]=0;
	for(int j=0;j<value;j++){
		for(int i=type[j];i<money;i++){
			if(Min[i]>Min[i-type[j]]+1){
				Min_path[i]=type[j];//在每个金额上记录路径,即每个硬币的面值 
				                    //即每个金额对应一个组合的最后的面值 
				Min[i]=Min[i-type[j]]+1;
			}
		}
	}
}
void print_ans(int *Min_path,int s){
	while(s){
		cout<<Min_path[s]<<" ";//打印输出 
		s=s-Min_path[s];//求剩余金额对应组合的最后一枚硬币
		                //每次都对剩余金额打印,直至剩余金额==0 
	}
}
int main(){
	int s;
	solve();
	while(cin>>s){
		cout<<Min[s]<<endl;
		print_ans(Min_path,s);
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值