题目描述
给定数组arr,arr中所有的值都为正整数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个aim,代表要找的钱数,求组成aim的最少货币数。
输入描述:
输入包括两行,第一行两个整数n(0<=n<=1000)代表数组长度和aim(0<=aim<=5000),第二行n个不重复的正整数,代表arr\left( 1 \leq arr_i \leq 10^9 \right)(1≤arr
i
≤10
9
)。
输出描述:
输出一个整数,表示组成aim的最小货币数,无解时输出-1.
示例1
输入
复制
3 20
5 2 3
输出
复制
4
说明
20=5*4
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
int arr[1007];
long long dp[5007];
const int inf=1000000009;
int main()
{
int n,aim;
int min_x=inf;
fill(dp,dp+5007,inf );//初始化dp数组
scanf("%d%d",&n,&aim);
for(int i=0;i<n;i++)
{
scanf("%d",&arr[i]);
min_x= min( min_x,arr[i] );
if( arr[i]<=aim ) //放置输入的钱的面值大于aim ,防止下标越界
dp[ arr[i] ] = 1;
}
for(int i=min_x ; i<=aim ;i++)
{
for(int j=0;j<n;j++)//遍历钱的种类
{
if( i+arr[j]<=aim ) //放置输入的钱的面值大于aim ,防止下标越界
dp[ i+arr[j] ]= min(dp[ i+arr[j] ] ,dp[i]+1 ) ;
}
}
if( dp[aim]>=inf )
cout<<"-1"<<endl;
else
cout<<dp[aim]<<endl;
return 0;
}