先来看看生活中经常遇到的事吧——假设您是个土豪,身上带了足够的1、5、11元面值的钞票。现在您的目标是凑出某个金额15,需要用到尽量少的钞票
//状态表示,用一个一维数组 a[i] 表示金额为i时所需要用到的最小纸张…
//状态计算 a[i]=min(a[i-1]+1,a[i-5]+1,a[i-11]+1);
记忆化搜索方法
#include<bits/stdc++.h>
using namespace std;
int a[20];
int dp(int x){
if(a[i]!=100) return a[x];
if(x>=11) {
a[x]=min(a[x],dp(x-11)+1);
a[x]=min(a[x],dp(x-5)+1);
a[x]=min(a[x],dp(x-1)+1);
return a[x];
}
if(x>=5){
a[x]=min(a[x],dp(x-5)+1);
a[x]=min(a[x],dp(x-1)+1);
return a[x];
}
if(x>=1){
a[x]=min(a[x],dp(x-1)+1);
return a[x];
}
}
int main(){
memset(a,100,sizeof a);
a[0]=0;
cout << dp(15);
return 0;
}
纯dp
#include<bits/stdc++.h>
using namespace std;
int a[20];
int main(){
for(int i=1;i<=15;i++){
a[i]=100; //这尼玛用memset咋不管用啊草
}
a[0]=0;
for(int i=1;i<=15;i++){
if(i>=11) a[i]=min(a[i],a[i-11]+1);
if(i>=5) a[i]=min(a[i],a[i-5]+1);
if(i>=1) a[i]=min(a[i],a[i-1]+1);
}
cout << a[15];
return 0;
}