题目描述
输入硬币的n种不同面值(各种面值的硬币个数不限)和m,输出构成1到m元的最少硬币数.
输入格式
第一行两个数n(n<=200),m(m<=10000),第二行n个面值
输出格式
共m行,每行为组成该值所需最少硬币数(若不能组成则输出-1)
样例
输入
3 4
1 2 3
输出
1
1
1
2
代码
#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <iomanip>
#include <algorithm>
#include <queue>
#include <stack>
#include <cmath>
#include <vector>
#include <map>
#include <set>
using namespace std;
int v[205],dp[10005],n,m;
int min(int a,int b){return a<b?a:b;}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n>>m;
for(int i=1;i<=m;i++){
dp[i]=0xffff;
dp[0]=0;
}
for(int i=1;i<=n;i++){
cin>>v[i];
}
for(int i=1;i<=n;i++){
for(int j=v[i];j<=m;j++){
dp[j]=min(dp[j],dp[j-v[i]]+1);
}
}
for(int i=1;i<=m;i++){
if(dp[i]==0xffff){
cout<<-1<<endl;
}
else{
cout<<dp[i]<<endl;
}
}
return 0;
}