Shein2023秋招提前批-零钱兑换(dp背包问题)
https://oj.algomooc.com/problem.php?id=5920
给定数组arr,arr中所有的值都为正整数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个aim,代表要找的钱数,求组成aim的最少货币数。
如果无解,请返回-1.
输入
第一行给定两个正整数分别是 n 和 aim 分别表示数组 arr 的长度和要找的钱数。
第二行给定 n 个正整数表示 arr 数组中的所有元素
其中,0 <= n <= 10000,0 < arr[i] <= 10000,0 <= aim <= 5000
输出
输出组成 aim 的最少货币数
样例输入 复制
3 20
5 2 3
样例输出 复制
4
提示
最少用四个 5 元凑成 20 元
这个就是个多重背包的问题,详情解释搜背包九讲,这个题复杂度是\(O(n*aim)\)
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=1e5+100;
int n,aim;
int a[maxn];
int dp[maxn];
int main(){
cin>>n>>aim;
for(int i=1;i<=n;i++){
cin>>a[i];
}
memset(dp,0x3f3f3f3f,sizeof(dp));
dp[0]=0;
for(int i=1;i<=n;i++){
for(int j=a[i];j<=aim;j++){
dp[j]=min(dp[j],dp[j-a[i]]+1);
}
}
if(dp[aim]==0x3f3f3f3f){
cout<<-1<<endl;
}
else cout<<dp[aim]<<endl;
}