You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.
# include <bits/stdc++.h>
using namespace std ;
//极限值,表示不可达
# define INF 0x3f3f3f3f
int dp [ 20020 ] ;
/**
* 设有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。
*/
int main ( ) {
//读取数据文件
freopen ( " ../2.txt " , " r " , stdin ) ;
int n , m ;
//初始化数组数据
cin > > n ;
int coins [ n ] ; //硬币个数
int value [ n ] ; //硬币面值
for ( int i = 0 ; i < n ; i + + ) {
cin > > value [ i ] > > coins [ i ] ;
}
//初始化DP表
cin > > m ;
for ( int i = 1 ; i < = m ; i + + ) {
dp [ i ] = INF ; //赋极大值,表示不可达
}
//利用动态规划进行填表
for ( int i = 0 ; i < n ; i + + ) {
for ( int j = 1 ; j < = coins [ i ] ; j + + ) { //遍历硬币数量
for ( int k = m ; k > = value [ i ] ; k - - ) {
dp [ k ] = min ( dp [ k ] , dp [ k - value [ i ] ] + 1 ) ;
}
}
}
cout < < ( dp [ m ] < m ? dp [ m ] : - 1 ) < < endl ;
}