动态规划学习(一)
动态规划算法通常基于一个递推公式以及一个或多个初始状态。当前子问题的解将由上一次子问题的解推出。使用动态规划来解决只需要多项式时间复杂度,因此比回溯法、暴力法要快很多。
初始条件,中间状态,状态方程。
有1元,3元(方便举例),5元的硬币,要拼凑n元,最少拿多少枚硬币。
初始:dp[0]=0;
状态方程:dp[i] = min(dp[i-1]+1,dp[i-3]+1,dp(i-5)+1)//i>=5;
dp[i] = min{dp[i-vj]},其中i-vj>=0,vj表示第j个硬币的面值;
1 #include <iostream> 2 #include <vector> 3 using namespace std; 4 int min(int a, int b){ 5 return (a > b ? b : a); 6 } 7 int main(){ 8 int n; 9 cin >> n; 10 vector<int>dp(n + 1); 11 dp[0] = 0; 12 for (int i = 1; i <= n; i++){ 13 if (i < 3){ 14 dp[i] = dp[i - 1] + 1; 15 } 16 else if (i < 5){ 17 dp[i] = min(dp[i - 1], dp[i - 3]) + 1; 18 } 19 else 20 dp[i] = min(dp[i - 1], min(dp[i - 3], dp[i - 5])) + 1; 21 } 22 return dp[n]; 23 }