DP硬币问题

硬币问题

题目描述

今有面值为 1、5、11 元的硬币各无限枚。

想要凑出 n n n 元,问需要的最少硬币数量。

输入格式

仅一行,一个正整数 n n n

输出格式

仅一行,一个正整数,表示需要的硬币个数。

样例 #1

样例输入 #1

15

样例输出 #1

3

样例 #2

样例输入 #2

12

样例输出 #2

2

提示

样例解释

对于样例数据 1,最佳方案是 15 = 5 + 5 + 5 15=5+5+5 15=5+5+5,使用到 3 枚硬币。

对于样例数据 2,最佳方案是 12 = 11 + 1 12=11 + 1 12=11+1,使用到 2 枚硬币。

数据规模与约定

对于 100 % 100\% 100% 的数据,保证 n ≤ 1 0 6 n\leq 10^6 n106

#include
#include
using namespace std;
int n;
int dp[1000020];
int min3(int a, int b, int c)
{
	int max;
	max = (a < b ? a : b);
	max = (max < c ? max : c);
	return max;
}
int main(void)
{
	ios::sync_with_stdio(0);
	memset(dp, 0x3f, 21 * sizeof(int));//zheng wuqiong
	int n;
	cin >> n;
	dp[20] = 0;//从20开始 20代表0钱的数目
	dp[1+20] = 1;
	dp[5+20] = 1;
	dp[11+20] = 1;
	for (int i = 1+20; i <= n+20; i++)
	{
		dp[i] = min3(dp[i - 1], dp[i - 5], dp[i - 11])+1;
	}
	cout << dp[n+20];
	return 0;

}

你可能感兴趣的:(刷题,算法,c++,动态规划)