最少硬币问题

Home
Contests
Experiments
Problems
Status
Ranklist
Logout
最少硬币问题
Time Limit: 1000 ms Memory Limit: 65536 KiB
Submit Statistic
Problem Description

设有n种不同面值的硬币,各硬币的面值存于数组T[1:n]中。现要用这些面值的硬币来找钱。可以使用的各种面值的硬币个数存于数组Coins[1:n]中。
对任意钱数0≤m≤20001,设计一个用最少硬币找钱m的方法。
对于给定的1≤n≤10,硬币面值数组T和可以使用的各种面值的硬币个数数组Coins,以及钱数m,0≤m≤20001,计算找钱m的最少硬币数。
Input

输入数据第一行中只有1个整数给出n的值,第2行起每行2个数,分别是T[j]和Coins[j]。最后1行是要找的钱数m。
Output

输出数据只有一个整数,表示计算出的最少硬币数。问题无解时输出-1。
Sample Input

3
1 3
2 3
5 3
18
Sample Output

5
Hint

Source

SDUTACM运维技术中心
Sat Nov 23 2019 21:06:13 GMT+0800 (CST)
Copyright © 2013-2017 SDUTACM Team. All Rights Reserved.

#include"bits/stdc++.h"
using namespace std;

using namespace std;
const int INF = 0x3f3f3f3f;
int main()
{
    int t[20001]; //t[i]为硬币面值
    int c[20001]; //c[i]可以使用的硬币个数
    int dd[20001]; //每种面值的硬币对应的最少的要找的钱数
    int n,m,i,j,k; //n为面值种类数 m为所需要找钱数
    memset(dd,0,sizeof(dd));
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>t[i]>>c[i];
    }
    cin>>m;
    for(int i=1;i<=m;i++)
        dd[i]=INF;
    for(i=1;i<=n;i++) //对于每一种面值
    {
        for(j=1;j<=c[i];j++) //对于每一种面值数
        {
            for(k=m;k>=t[i];k--) //从所需要的钱数到硬币的面值数  凑齐价值为K的钱所需要的硬币数为dd[k]
                dd[k]=min(dd[k],dd[k-t[i]]+1);
        }
    }
    if(dd[m]==INF)
        cout<<"-1"<<endl;
    else cout<<dd[m]<<endl;
}

你可能感兴趣的:(算法实验动态规划)