硬币问题
题目描述
今有面值为 1、5、11 元的硬币各无限枚。
想要凑出 nnn 元,问需要的最少硬币数量。
输入格式
仅一行,一个正整数 nnn。
输出格式
仅一行,一个正整数,表示需要的硬币个数。
样例 #1
样例输入 #1
15
样例输出 #1
3
样例 #2
样例输入 #2
12
样例输出 #2
2
提示
样例解释
对于样例数据 1,最佳方案是 15=5+5+515=5+5+515=5+5+5,使用到 3 枚硬币。
对于样例数据 2,最佳方案是 12=11+112=11 + 112=11+1,使用到 2 枚硬币。
数据规模与约定
对于 100%100\%100% 的数据,保证 n≤106n\leq 10^6n≤106。
知识点
- 动态规划
- 最优解
思路
求出给定的钱数之前的所有最优解,例如要求15,把三种情况的最优解都求出来,再比较三种情况的最优解。

【动态规划 硬币问题】https://www.bilibili.com/video/BV1G7411B7Et?vd_source=dbdd9e1a7441557dad5166918dbb3485
#include<bits/stdc++.h>
using namespace std;
int n,cost,i;
int dp[1000010];
int main()
{
dp[0]=0;
cin>>n;
for(i=1;i<=n;i++)
{
cost=999999;
//进行三种情况的比较
if(i>=1) cost=min(cost,dp[i-1]+1);
if(i>=5) cost=min(cost,dp[i-5]+1);
if(i>=11) cost=min(cost,dp[i-11]+1);
dp[i]=cost;
}
cout<<dp[n];
}
注意定义数组时要在main函数之外全局定义,因为数组比较大。
时间:2024.1.15
819

被折叠的 条评论
为什么被折叠?



