一般性的最少硬币组成问题

时间:2019-11-15
本文章向大家介绍一般性的最少硬币组成问题,主要包括一般性的最少硬币组成问题使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

一般性的最少硬币组成问题

Description

从n种币值为a[1..n]的硬币中,任选几个硬币组成价值为V的一堆货币,问最少需要几个硬币?其中每种硬币的数量没有限制。1<=n<=100,1<=v<=100000,1<=a[i]<=100000

Input

输入中有两行:第一行有两个数v和n;第二行有n个以空格分隔的数,表示n个币值.

Output

输出只有一行,该行只有一个数,表示所需的最少硬币数, 如果无论如何选取硬币,均不能得到币值v,则输出0.

Sample Input

10 2 
3 5

Sample Output

2

HINT

Source

#include <bits/stdc++.h>
using namespace std;
int v,n,a[101];
int f[100001];
int main()
{
    cin>>v>>n;
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    memset(f,-1,sizeof(f));
    f[0]=0;
    for(int i=0;i<=v;i++)
        if(f[i]!=-1)
            for(int j=1;j<=n;j++)
                if(i+a[j]<=v)
                {
                    if(f[i+a[j]]==-1) f[i+a[j]]=f[i]+1;
                    else if(f[i+a[j]]>f[i]+1) f[i+a[j]]=f[i]+1;
                }
    if(f[v]==-1) cout<<0<<endl;
    else cout<<f[v]<<endl;
    return 0;
}
 
/**************************************************************
    Problem: 1610
    User: LJA001162
    Language: C++
    Result: 正确
    Time:12 ms
    Memory:1928 kb
****************************************************************/

原文地址:https://www.cnblogs.com/LJA001162/p/11867893.html