前言
算是一枚小白吧,写博客主要是为了巩固知识,毕竟本人就是:学了忘忘了学,学了还得忘,忘了还得学…今天最后一道题,动态规划解决硬币问题,明天要写打印硬币问题的最佳结果,看黑皮书上要逆推…(秃头…)…明天加油!!!
一、题目分析
简单硬币问题,之前用贪心做过,现在刚学动态规划,努力一波~ 给你五个面值(1,5,10,25,50)的钱,给你一个money,求凑够money的最少硬币数量。 1)当只用1分硬币时 i=0,Min[0]=0,表示金额为0,硬币数量为0,初始化Min[0]=0, i=1,Min[1]=1,即Min[0]+1=Min[1-1]+1; i=2,Min[2]=2,即Min[1]+1=Min[2-1]+1; 所以递推式为:Min[i]=min(Min[i],Min[i-1]+1); 2)当增加5分硬币时,比五分硬币小的金额不能用到5分硬币、 i=5,Min[5]=Min[5-5]+1=1; i=6,Min[6]=Min[6-5]+1=2; 所以递推式为:Min[i]=min(Min[i],Min[i-5]+1) … 所以最终的递推式为:Min[i]=min(Min[i],Min[i-type[j]]+1);
二、代码
#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];
void solve(){
for(int k=0;k<money;k++){
Min[k]=INT_MAX;
}
Min[0]=0;
for(int j=0;j<value;j++){
for(int i=type[j];i<money;i++){
Min[i]=min(Min[i],Min[i-type[j]]+1);
}
}
}
int main(){
int s;
solve();
while(cin>>s){
cout<<Min[s]<<endl;
}
}
|