一般性的最少硬币组成问题
一般性的最少硬币组成问题
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
****************************************************************/