前言
硬币问题深入一波~
一、题目分析
在知道凑成总金额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];
}
}
int main(){
int s;
solve();
while(cin>>s){
cout<<Min[s]<<endl;
print_ans(Min_path,s);
}
}
|