题目链接:B3635 硬币问题 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
题目描述:
思路:
动态规划:这是一道基础的DP,创建一个money[ ]数组存储硬币的面值,做Min[ i ]表来存储 i 元时所需硬币的最小数量。
图解:
AC代码(c++):
#include<bits/stdc++.h>
using namespace std;
#define maxn 1000001//最大
int Min[maxn],money[3]={1,5,11},n;//money[]存储硬币面值(其他题根据题目需要可做自行改动)
int main(){
memset(Min,maxn,sizeof(Min));//赋大值,后面min时作比较用
Min[0]=0;//DP初始化
//打出0-1000000元所需的最小硬币数表
for(int i=0;i<=2;i++){//遍历money[]
for(int j=money[i];j<maxn;j++){//当硬币为money[i]时,从money[i]开始,1000000结束。
Min[j]=min(Min[j],Min[j-money[i]]+1);
}
}
//直接查表
cin>>n;//输入所查询n元
cout<<Min[n];//输出n元时的最小硬币数
}