###
看了知乎关于动态规划的一篇回答有感
链接如下:
什么是动态规划(Dynamic Programming)?动态规划的意义是什么? - 知乎
https://www.zhihu.com/question/23995189
###
实现一下钞票面额分别是1、5、11,凑出输入金额所需的最小钞票数.
#include <bits/stdc++.h>
using namespace std;
int dp[10000];
int main()
{
int n;
cin>>n;
int money[] = {1,5,11};//规定钞票面额
dp[0] = 0 ;
for(int i =1;i<=n;i++)
{
int cost = 100000;//取一个极大的cost
if(i-money[2]>=0) cost = min(cost,dp[i-money[2]]+1);//如果当前所需金额超过钞票面额,则转化为i-money[i]的最优解
if(i-money[1]>=0) cost = min(cost,dp[i-money[1]]+1);
if(i-money[0]>=0) cost = min(cost,dp[i-money[0]]+1);
dp[i] = cost;
}
cout<<dp[n];
}
###
思考一下,若钞票面额的数量m不确定呢? 假设这里 m =3;
#include <bits/stdc++.h>
using namespace std;
int dp[10000];
int main()
{
int n,m;
m=3;//取m=3
cin>>n;
int money[] = {0,1,5,11};
dp[0] = 0 ;
for(int i =1;i<=n;i++)
{
int cost = 1000000;
for(int j =m;j>=1;j--)//遍历每一种面额
{
if(i - money[j]>=0)
cost = min(cost,dp[i-money[j]]+1);
}
dp[i] = cost;//将每一次m中面额的最小值给dp[i]赋值.
}
cout<<dp[n];
}
###
如果我不想用cost呢?
将dp数组改为vector容器dp,一定要赋初值.
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,m;
m=3;
cin>>n;
int money[] = {0,1,5,11};
vector<int> dp(n+1,n+1);//一定要赋大的初值,否则取不到最小值.
dp[0] = 0 ;
for(int i =1;i<=n;i++)
{
for(int j =1;j<=m;j++)
{
if(i - money[j]>=0)
dp[i] = min(dp[i],dp[i-money[j]]+1);
}
}
cout<<dp[n];
}
###
简单斐波那契数列(递归实现)
#include <bits/stdc++.h>
using namespace std;
int fibonacci(int n)
{
if(n==1) return 1;
if(n==2) return 1;
return fibonacci(n-1) + fibonacci(n-2);
}
int main()
{
int n;
cin>>n;
cout<<fibonacci(n);
}
因为每一个f(n)可能被重复计算多次,时间复杂度很高,故考虑一种方式记忆,造一个「备忘录」.(可以用哈希表或者map)
#include <bits/stdc++.h>
using namespace std;
unordered_map<int,int> cnt;
int fibonacci(int n)
{
if(n==1) return 1;
if(n==2) return 1;
if(cnt[n] !=0)
{
return cnt[n];
}
else
{
cnt[n] = fibonacci(n-1) + fibonacci(n-2);
return fibonacci(n-1) + fibonacci(n-2);
}
}
int main()
{
int n;
cin>>n;
cout<<fibonacci(n);
}
###
当然,也可以用数组存储每一个值,通过递推的方式自底向上算出每一个f[i]
#include <bits/stdc++.h>
using namespace std;
int fibonacci[10000];
int main()
{
int n;
cin>>n;
fibonacci[1] = 1;
fibonacci[2] = 1;
for(int i =3;i<=n;i++)
{
fibonacci[i] = fibonacci[i-1] + fibonacci[i-2];
}
cout<<fibonacci[n];
}
这其实便是dp的雏形.
###