第一题
动态规划
CD12 换钱的最少货币数
问题描述
代码:
#include <iostream>
#include <vector>
using namespace std;
int main(){
int n,aim,temp;
cin>>n>>aim;
vector<int>arrs;
while(n--){
cin>>temp;
arrs.emplace_back(temp);
}
//核心代码
vector<int> f(aim+1,-1); //f[i]里存aim为1-20的最小货币数
f[0]=0;
n=arrs.size(); //n要重新赋值
for(int i=1;i<aim+1;i++){
//对每一个i(aim值),遍历每一个货币,找最小的f[i].
for(int j=0;j<n;j++){
if(i-arrs[j]>=0&&f[i-arrs[j]]!=-1){
if(f[i]==-1) f[i]=f[i-arrs[j]]+1;
else f[i]=min(f[i],f[i-arrs[j]]+1);
}
}
}
cout<<f[aim];
}
note
针对每一个i(aim)
f[i]=min(f[i-a]+1,f[i-b]+1,f[i-c]+1,...)
第二题
动态规划
CD19 换钱的方法数
思路
f[i]=f[i-a]+f[i-b]+f[i-c]+...
->
分别算每一个
f1[i]=f[i]+f[i-b]
f2[i]=f[i]+f[i-b]
f3[i]=f[i]+f[i-b]
然后把f1[i]+f2[i]+f3[i]加起来
代码
#include <iostream>;
#include <vector>;
using namespace std;
int main(){
int n,aim,temp;
cin>>n>>aim;
vector<int> arrs;
while(n--){
cin>>temp;
arrs.emplace_back(temp);
}
//核心代码
vector<int> f(aim+1,0);
f[0]=1;
n=arrs.size();
for(int j=0;j<n;j++){
for(int i=arrs[j];i<=aim;i++){
f[i]=(f[i]+f[i-arrs[j]])%1000000007;
}
}
cout<<f[aim];
}