爬樓梯 (進階)
題目鏈接?爬樓梯(進階版)
本題目屬于排列中的背包問題,所以先遍歷背包,后遍歷物品,剩下的就是完全背包的板子了,下面直接上代碼:
#include<iostream>
#include<vector>
using namespace std;
int main (){int n,m;cin>>n>>m;vector<int> dp(n+1,0);dp[0] = 1;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(i>=j){dp[i] += dp[i-j];}}}cout<<dp[n];return 0;
}
Leetcode 322. 零錢兌換
題目鏈接?322 零錢兌換
組合類,注意一下初始化,代碼:
class Solution {
public:int coinChange(vector<int>& coins, int amount) {vector<int> dp(amount+1,INT_MAX);dp[0] = 0;for(int i=0;i<coins.size();i++){for(int j=coins[i];j<=amount;j++){if(dp[j-coins[i]] != INT_MAX){dp[j] = min(dp[j],dp[j-coins[i]]+1);}}}if(dp[amount] == INT_MAX){//沒有被覆蓋,說明無法湊成amountreturn -1;}return dp[amount];}
};
Leetcode 279. 完全平方數
題目鏈接?279 完全平方數
只不過是把順序數改成了平方數,思路一樣的,完全平方數就是物品(可以無限件使用),湊個正整數n就是背包,問湊滿這個背包最少有多少物品?直接上代碼:
class Solution {
public:int numSquares(int n) {vector<int> dp(n+1,INT_MAX);dp[0] = 0;for(int i=1;i*i<=n;i++){for(int j=i*i;j<=n;j++){dp[j] = min(dp[j],dp[j-i*i]+1);}}return dp[n];}
};
end