From 974e66aba2e86d68b71c91bbc6bcf80baac7dbc5 Mon Sep 17 00:00:00 2001 From: lee3yearsold <56989190+lee3yearsold@users.noreply.github.com> Date: Mon, 20 Feb 2023 11:08:26 +0800 Subject: [PATCH] Add files via upload --- ...ƒŒåŒ…的排列问题二维迭代ç†è§£).md | 145 ++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100644 problems/0377-ç»„åˆæ€»å’ŒIV(完全背包的排列问题二维迭代ç†è§£).md diff --git a/problems/0377-ç»„åˆæ€»å’ŒIV(完全背包的排列问题二维迭代ç†è§£).md b/problems/0377-ç»„åˆæ€»å’ŒIV(完全背包的排列问题二维迭代ç†è§£).md new file mode 100644 index 00000000..276329c5 --- /dev/null +++ b/problems/0377-ç»„åˆæ€»å’ŒIV(完全背包的排列问题二维迭代ç†è§£).md @@ -0,0 +1,145 @@ +# 完全背包的排列问题模拟 + +#### Problem + +1. 排列问题是完全背包中å分棘手的问题。 +2. 其在迭代过程中需è¦å…ˆè¿­ä»£èƒŒåŒ…容é‡ï¼Œå†è¿­ä»£ç‰©å“个数,使得其在代ç ç†è§£ä¸Šè¾ƒéš¾å…¥æ‰‹ã€‚ + +#### Contribution + +本文档以力扣上[ç»„åˆæ€»å’ŒIV](https://leetcode.cn/problems/combination-sum-iv/)为例,æä¾›ä¸€ä¸ªäºŒç»´dp的代ç ä¾‹å­ï¼Œå¹¶æä¾›æ¨¡æ‹Ÿè¿‡ç¨‹ä»¥ä¾¿äºŽç†è§£ + +#### Code + +```cpp +int combinationSum4(vector& nums, int target) { + // 定义背包容é‡ä¸ºtarget,物å“个数为nums.size()çš„dp数组 + // dp[i][j]表示将第0-iä¸ªç‰©å“æ·»åŠ å…¥æŽ’åˆ—ä¸­ï¼Œå’Œä¸ºjçš„æŽ’åˆ—æ–¹å¼ + vector> dp (nums.size(), vector(target+1,0)); + + // 表示有0,1,...,n个物å“å¯é€‰æ‹©çš„æƒ…况下,和为0的选择方法为1:什么都ä¸å– + for(int i = 0; i < nums.size(); i++) dp[i][0] = 1; + + // 必须按列é历,因为å³è¾¹æ•°ç»„需è¦çŸ¥é“左边数组最低部的信æ¯ï¼ˆæŽ’列问题) + // åŽé¢çš„æ¨¡æ‹Ÿå¯ä»¥æ›´æ¸…楚的表现这么æ“作的原因 + for(int i = 1; i <= target; i++){ + for(int j = 0; j < nums.size(); j++){ + // åªæœ‰nums[j]å¯ä»¥å–的情况 + if(j == 0){ + if(nums[j] > i) dp[j][i] = 0; + // å¦‚æžœèƒŒåŒ…å®¹é‡æ”¾ä¸ä¸‹ é‚£ä¹ˆæ­¤æ—¶æ²¡æœ‰æŽ’åˆ—æ–¹å¼ + else dp[j][i] = dp[nums.size()-1][i-nums[j]]; + // å¦‚æžœèƒŒåŒ…å®¹é‡æ”¾çš„下 全排列方å¼ä¸ºdp[最底层][容é‡-该物å“容é‡]排列方å¼åŽé¢æ”¾ä¸€ä¸ªnums[j] + } + // 有多个numsæ•°å¯ä»¥å– + else{ + // å¦‚æžœèƒŒåŒ…å®¹é‡æ”¾ä¸ä¸‹ 那么沿用0-j-1个物å“çš„æŽ’åˆ—æ–¹å¼ + if(nums[j] > i) dp[j][i] = dp[j-1][i]; + // å¦‚æžœèƒŒåŒ…å®¹é‡æ”¾å¾—下 在dp[最底层][容é‡-该物å“容é‡]排列方å¼åŽé¢æ”¾ä¸€ä¸ªnums[j]åŽé¢æ”¾ä¸ªnums[j] + // INT_MAXé¿å…溢出 + else if(i >= nums[j] && dp[j-1][i] < INT_MAX - dp[nums.size()-1][i-nums[j]]) + dp[j][i] = dp[j-1][i] + dp[nums.size()-1][i-nums[j]]; + } + } + } + // 打å°dp数组 + for(int i = 0; i < nums.size(); i++){ + for(int j = 0; j <= target; j++){ + cout<