//动态规划法
//硬币问题
//如果我们有面值为1元、3元和5元的硬币若干枚,如何用最少的硬币凑够11元?
//(表面上这道题可以用贪心算法,但贪心算法无法保证可以求出解,比如1元换成2元的时候)
//程序中v[]为硬币面值,下标从1开始,d[i]为i状态下的最优解
#include <iostream>
#include <cstring>
#define N 1000
#define MAX 1000
using namespace std;
int MIN_COIN(int v[],int n,int S) //v[]为硬币面值,n为硬币种类数量
{
int d[N];
d[0]=0;
for(int i=1;i<N;i++) d[i]=MAX;
for(int i=1;i<=S;i++)
{
for(int j=1;j<=n;j++)
{
if(v[j]<=i && (d[i-v[j]]+1)<d[i]) d[i]=d[i-v[j]]+1;
}
}
return d[S];
}
int main(int argc, char *argv[])
{
int v[N];
int n; cin >> n;
for(int i=1;i<=n;i++) cin >> v[i];
int S; cin >> S;
cout << MIN_COIN(v,n,S) << endl;
cout << "Hello World!" << endl;
return 0;
}
最少硬币(动态规划法,初级)
最新推荐文章于 2024-08-13 09:00:00 发布