Find the minimum number of coins to make change for n cents using coins of denominations d1, d2,.., dm. The coins can be used any number of times.
Input
n m
d1 d2 ... dm
Two integers n and m are given in the first line. The available denominations are given in the second line.
Output
Print the minimum number of coins in a line.
Constraints
- 1 ≤ n ≤ 50000
- 1 ≤ m ≤ 20
- 1 ≤ denomination ≤ 10000
- The denominations are all different and contain 1.
Sample Input 1
55 4
1 5 10 50
Sample Output 1
2
Sample Input 2
15 6
1 2 7 8 12 50
Sample Output 2
2
Sample Input 3
65 6
1 2 7 8 12 50
Sample Output 3
3
继续学习DP算法,感觉一直不开窍啊。。。。
这道题目很经典了,给出m个价值不同的硬币c1、c2……cm,要求找出能够凑出总价为n的方法,在维基上看到大概的思路如下:
简单地理解,就是能够凑出价值i的情况只有两种,一种是不包括硬币cj,一种是包括硬币cj,我们只需要将两种情况相加即可
#include <iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
using namespace std;
const int inf=0x3f3f3f;
const int maxn=50001;
int c[21];
int dp[maxn];
int main()
{
int n,m;
cin>>n>>m;
for(int i=1; i<=m; i++)
cin>>c[i];
for(int i=0; i<=maxn; i++)
dp[i]=inf;
dp[0]=0;
for(int i=1; i<=m; i++)
for(int j=c[i]; j<=n; j++)
{
dp[j]=min(dp[j],dp[j-c[i]]+1);
}
cout<<dp[n]<<endl;
return 0;
}