国企集团门户网站建设方案,企业网站建设公司地址,电商网站平台建设方案,购物平台官网今天进入完全背包。
Leetcode 518. 零钱兑换 II
题目链接 518 零钱兑换 II
由于是可以选取多个元素#xff0c;所以是完全背包#xff0c;要注意在遍历顺序中前序遍历#xff0c;其他的和前面的目标数这个题目类似#xff0c;要理解dp[j]dp[j-nums[i]]的来源。#xff…今天进入完全背包。
Leetcode 518. 零钱兑换 II
题目链接 518 零钱兑换 II
由于是可以选取多个元素所以是完全背包要注意在遍历顺序中前序遍历其他的和前面的目标数这个题目类似要理解dp[j]dp[j-nums[i]]的来源。总体来是还是比较难想的
下面上代码
class Solution {
public:int change(int amount, vectorint coins) {vectorint dp(amount1,0);dp[0] 1;for(int i0;icoins.size();i){for(int jcoins[i];jamount;j){//dp的含义容量j下能装下的元素的组合数dp[j] dp[j-coins[i]];}}return dp[amount];}
};
Leetcode 377. 组合总和 Ⅳ
题目链接 377 组合总和 Ⅳ
本题目就是上个题目的改版这个要求的是排列数所以我们只需先便利背包在遍历物品即可原因卡哥讲过还要注意C测试用例有两个数相加超过int的数据所以需要在if里加上dp[i] INT_MAX - dp[i - num]。
直接上代码
class Solution {
public:int combinationSum4(vectorint nums, int target) {vectorint dp(target1,0);dp[0] 1;for(int i0;itarget;i){//遍历背包for(int j0;jnums.size();j){//遍历物品if(inums[j] dp[i] INT_MAX - dp[i - nums[j]]){//C测试用例有两个数相加超过int的数据所以需要在if里加上dp[i] INT_MAX - dp[i - num]。dp[i] dp[i-nums[j]];}}}return dp[target];}
};
end