1 70. 爬楼梯(完全背包版)
完全背包+装满的选法+排列的套路,AC代码:
class Solution {
public:
/*
完全背包的思路:
1 2是两个物体 可以无限取
*/
int dp[50]; // 能爬到第i楼的选法的排列数
/*
dp[j] += dp[j - i];
dp[0] = 1
for容积j++ for物体i++ 排列+无限个
模拟——n=3
*/
int climbStairs(int n)
{
dp[0] = 1;
for(int j = 0; j <= n; j++)
for(int i = 1; i <= 2; i++) //物体
if(j >= i)
dp[j] += dp[j - i];
// for(int i = 1; i <= 2; i++)
// {
// for(int j = 0; j <= n; j++)
// cout << tmp[i][j] << ' ';
// puts("");
// }
return dp[n];
}
};
2 322. 零钱兑换
之前做过,直接看这篇
3 279. 完全平方数
之前没学多重背包之前看到题目是蒙的,现在学完完全背包很自然就做出来了,AC代码:
class Solution {
public:
int dp[10010]; // dp[1]表示 凑成i的完全平方数最少需要的数目
/*
转成完全背包
物品:i = 1....sqrt(n)
背包:n
dp[j] = min(dp[j- i]+1,dp[j])
装i 不撞i
dp[0] = 0 其他非0下标全设为INT_MAX
i++j++
模拟——
*/
int numSquares(int n) {
dp[0] = 0;
for(int j = 1; j <= n; j++)dp[j] = INT_MAX;
for(int i = 1; i*i <= n; i++)
{
for(int j = 0; j <= n; j++)
{
if(j >= i*i)dp[j] = min(dp[j- i*i]+1,dp[j]);
else dp[j] = dp[j];
}
// for(int j = 0; j <= n; j++) cout << dp[j] << ' ';
// puts("");
}
return dp[n];
}
};