Skip to content

Commit 0058524

Browse files
committed
knapsack
1 parent fe4c03a commit 0058524

File tree

4 files changed

+121
-0
lines changed

4 files changed

+121
-0
lines changed

huawei/j16.py

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# input money and count
2+
money , count = map(int , input().split())
3+
4+
t = []
5+
for i in range(count):
6+
price , prio , main = map( int , input().split())
7+
t.append((price , prio , main))
8+
9+
# price * prio
10+

src/dynamicplan/SumSquare.py

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
def numSquares(n):
2+
"""
3+
Given an integer n, return the least number of perfect square numbers
4+
that sum to n.
5+
"""
6+
# Base cases
7+
if n < 4:
8+
return n
9+
10+
# Initialize a list to store the minimum number of squares for each number
11+
dp = [0] * (n + 1)
12+
13+
# Initialize the first 4 elements
14+
for i in range(1, 4):
15+
dp[i] = i
16+
17+
# Iterate through the remaining numbers
18+
for i in range(4, n + 1):
19+
# Find the minimum number of squares that sum up to i
20+
min_squares = i
21+
j = 1
22+
while j * j <= i:
23+
min_squares = min(min_squares, 1 + dp[i - j * j])
24+
j += 1
25+
dp[i] = min_squares
26+
27+
return dp[n]
28+
29+
30+
print(numSquares(13))

src/dynamicplan/knapsack.md

+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
2+
``` python
3+
def knapsack(w , wt , val , n):
4+
## 初始化 dp数组。 dp[i][j] 表示的意思是在 容量为j的时候,选择前i个物品可以得到的最大价值
5+
## 注意,
6+
dp = [ [ 0 for j in range(w + 1)] for i in range(n +1)]
7+
8+
for i in range(1 , n + 1):
9+
for j in range(1 , w + 1):
10+
if wt[i -1 ] <= j: ## 如果 第i个物品的重量小于 j
11+
## 可以有两种选择,
12+
# dp[i - 1][j] 不选 物品i ,则最大价值就是 只选i - 1 之前的物品的最大价值。
13+
# dp[i - 1][j - wt[i -1]] + val[i - 1]
14+
# 则价值为 没有选物品i的扣去物品i重量的最大价值 加上 物品i的价值。
15+
# 注意!! wt[i - 1] 表示的是 物品i的重量。
16+
# 注意!! val[i - 1]表示对而是 物品i的价值。
17+
# 因为数组 wt 和 val 都是从下标0 算起的,而 dp数组是从 1 算起的 , 所以这地方的理解尤为关键。
18+
dp[i][j] = max(dp[i-1][j] , dp[i - 1][ j - wt[i -1]] + val[i - 1])
19+
else:
20+
dp[i][j] = dp[i -1][j]
21+
22+
return dp[n][w]
23+
24+
# 示例使用
25+
w = 50
26+
wt = [10, 20, 30]
27+
val = [60, 100, 120]
28+
n = 3
29+
print(knapsack(w, wt, val, n)) # 输出: 220
30+
```
31+
32+
解释如下:
33+
34+
1. 定义函数`knapsack(w, wt, val, n)`接受4个输入参数:
35+
- `w`: 背包容量
36+
- `wt`: 每个物品的重量列表
37+
- `val`: 每个物品的价值列表
38+
- `n`: 物品数量
39+
2. 创建一个二维数组`dp`来存储中间计算结果。其中`dp[i][j]`表示前`i`个物品放入容量为`j`的背包可以获得的最大价值。
40+
3. 使用双重循环填充`dp`数组。对于每个物品`i`和背包容量`j`:
41+
- 如果当前物品重量`wt[i-1]`小于等于当前容量`j`,则有两种选择:
42+
1. 不放该物品,最大价值为`dp[i-1][j]`
43+
2. 放该物品,最大价值为`dp[i-1][j-wt[i-1]] + val[i-1]`
44+
取两者中较大的值作为`dp[i][j]`的值。
45+
- 如果当前物品重量大于当前容量,则`dp[i][j] = dp[i-1][j]`,沿用上一个状态的最大价值。
46+
4. 最终返回`dp[n][w]`,即为最优解。
47+
48+
该算法的时间复杂度为O(n*W),空间复杂度为O(n*W),其中n为物品数量,W为背包容量。

src/dynamicplan/knapsack.py

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
2+
"""
3+
总体来说,动态规划 dynamic programming 是 利用到 递归,通过解决小问题不断累计,从而解决大问题
4+
5+
"""
6+
7+
def knapsack(w , wt , val , n):
8+
## 初始化 dp数组。 dp[i][j] 表示的意思是在 容量为j的时候,选择前i个物品可以得到的最大价值
9+
## 注意,
10+
dp = [ [ 0 for j in range(w + 1)] for i in range(n +1)]
11+
12+
for i in range(1 , n + 1):
13+
for j in range(1 , w + 1):
14+
if wt[i -1 ] <= j: ## 如果 第i个物品的重量小于 j
15+
## 可以有两种选择,
16+
# dp[i - 1][j] 不选 物品i ,则最大价值就是 只选i - 1 之前的物品的最大价值。
17+
# dp[i - 1][j - wt[i -1]] + val[i - 1]
18+
# 则价值为 没有选物品i的扣去物品i重量的最大价值 加上 物品i的价值。
19+
# 注意!! wt[i - 1] 表示的是 物品i的重量。
20+
# 注意!! val[i - 1]表示对而是 物品i的价值。
21+
# 因为数组 wt 和 val 都是从下标0 算起的,而 dp数组是从 1 算起的 , 所以这地方的理解尤为关键。
22+
dp[i][j] = max(dp[i-1][j] , dp[i - 1][ j - wt[i -1]] + val[i - 1])
23+
else:
24+
dp[i][j] = dp[i -1][j]
25+
26+
return dp[n][w]
27+
28+
# 示例使用
29+
w = 50
30+
wt = [10, 20, 30]
31+
val = [60, 100, 120]
32+
n = 3
33+
print(knapsack(w, wt, val, n)) # 输出: 220

0 commit comments

Comments
 (0)