云南云桥建设股份有限公司官方网站,网站服务器名字,电商培训机构推荐,亚马逊购物网完全背包518. 零钱兑换 II#xff01;#xff01;#xff01;程序未通过原因#xff1a; 1、dp数组的初始化没考虑清楚 2、组合问题 dp数组的更新没考虑清楚 修改后#xff1a; class Solution {
public:int change(int amount, vectorint coins) {// dp[j… 完全背包 518. 零钱兑换 II·程序未通过原因 1、dp数组的初始化没考虑清楚 2、组合问题 dp数组的更新没考虑清楚 修改后 class Solution {
public:int change(int amount, vectorint coins) {// dp[j]表示装满容量为j的背包一共有多少种方法vectorint dp(amount 1, 0);int n coins.size();dp[0] 1;for(int i 0; i n; i){for(int j coins[i]; j amount; j){//组合数问题dp[j] dp[j - coins[i]];}}return dp[amount];}
}; 377. 组合总和 Ⅳ 注意 如果求组合数就是外层for循环遍历物品内层for遍历背包。 如果求排列数就是外层for遍历背包内层for循环遍历物品。 先遍历物品的时候相当于是先把这个物品放进去了然后再看其他的能不能放进去所以不会出现逆序 先遍历背包相当于是用每个大小的背包看看把每一个物品都放进去一次再看别的物品能不能放进去所以可以有逆序 程序未通过原因 1、未考虑 j nums[i] 2、C测试用例有两个数相加超过int的数据所以需要在if里加上dp[i] INT_MAX - dp[i - num] class Solution {
public:int combinationSum4(vectorint nums, int target) {//dp[j] 表示 装满背包为j的 排列数vectorint dp(target 1, 0);dp[0] 1;// 先遍历背包 再遍历物品for(int j 0; j target; j){for(int i 0; i nums.size(); i){if(j - nums[i] 0 dp[j] INT_MAX - dp[j - nums[i]]) {dp[j] dp[j - nums[i]];}}}return dp[target];}
};