思路:动态规划,建立aim+1位的数组f,f[i]表示i元所需最小张数。初始都赋值为-1,0位置的值为0.进行动态规划,对于每一个位置i,遍历面值数组,i减去面值在f数组范围内且可达(即f对应位置不为-1)则更新数组f。
#include <iostream>
#include <vector>
using namespace std;
int main(){
int n,aim,temp;
cin>>n>>aim;
vector<int> nums;
while(n--){
cin>>temp;
nums.emplace_back(temp);
}
vector<int> f(aim+1,-1);
f[0]=0;
n=nums.size();
for(int i=1;i<=aim;++i){
for(int j=0;j<n;++j)
if(i-nums[j]>=0&&f[i-nums[j]]!=-1)
if(f[i]==-1) f[i]=f[i-nums[j]]+1;
else f[i]=min(f[i],f[i-nums[j]]+1);
}
cout<<f[aim];
}