CD 12 换钱的最少货币数

题目描述
给定数组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;
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值