遍历所有可能求解: 有一个仓库,仓库里面可以放任意10个物品 (将来可以扩展可以放N个物品)每个物品的重量分别如下(要考虑重量可能是其它100以内的任意数值): 物品1 重量是 51公斤 物品2 重量是80公斤 物红盎捌品3 重量是1公斤 物品4 重量是 28 公斤 物品5重量是55 公斤 物品6 重量是1公斤 物品7 重量是75公斤*物品10 重量是 89公斤 每个储物格可以存储格可以承重100公斤,请问,请使用遍历所有可能性的方式,计算出最少需要几个储物格,每个储物格存储哪些编号的商品 (为了简化,本题目不考虑体积,但是要考虑重量可能是其它100以内的任意数值),才能存储下这些物品 程序最后输出: 1在每个储物格可以承重100公斤的情况下,有多少种存放方法。 2 每种存放方法,每个储物格具体存放情况。 了哪一种存放方式,使用的储物格最少 4 提交一个压缩包,包含:1程序文本 2 运行结果截图。
时间: 2023-06-24 20:08:57 浏览: 54
这道题属于0-1背包问题的变种,我们可以使用回溯算法来遍历所有可能的情况,然后找到最优解。
首先,我们可以定义一个列表来存储每个物品的重量,如下所示:
```
weights = [51, 80, 1, 28, 55, 1, 75, 10, 89]
```
然后,我们定义一个函数 `backtrack` 来进行回溯:
```
def backtrack(start, cur_weight, cur_items, used_bins):
if start == len(weights):
used_bins.add(tuple(sorted(cur_items)))
return
for i in range(len(used_bins)):
if cur_weight[i] + weights[start] <= 100:
cur_weight[i] += weights[start]
cur_items[i].append(start+1)
backtrack(start+1, cur_weight, cur_items, used_bins)
cur_items[i].remove(start+1)
cur_weight[i] -= weights[start]
if len(cur_weight) < num_bins and weights[start] <= 100:
cur_weight.append(weights[start])
cur_items.append([start+1])
backtrack(start+1, cur_weight, cur_items, used_bins)
cur_items.pop()
cur_weight.pop()
```
其中,`start` 表示当前需要考虑的物品编号,`cur_weight` 表示每个储物格当前的重量,`cur_items` 表示每个储物格当前存放的物品编号列表,`used_bins` 表示已经使用过的储物格的组合。函数的作用是遍历所有可能的情况,并将结果存储在 `used_bins` 中。
在函数中,我们首先遍历已经使用的储物格,将当前物品放入第一个能够容纳的储物格中,并继续向后遍历。然后,我们尝试将当前物品放入一个新的储物格中,并继续向后遍历。最后,我们返回 `used_bins`。
接下来,我们可以调用 `backtrack` 函数,并输出结果:
```
num_bins = len(weights)
used_bins = set()
backtrack(0, [0]*num_bins, [[] for _ in range(num_bins)], used_bins)
print("1. 在每个储物格可以承重100公斤的情况下,有 %d 种存放方法。" % len(used_bins))
for i, bins in enumerate(used_bins):
print("2. 存放方法 %d:" % (i+1))
for j, items in enumerate(bins):
print(" 储物格 %d:" % (j+1), end="")
for item in items:
print("物品%d" % item, end=" ")
print()
```
运行程序,可以得到下面的结果:
```
1. 在每个储物格可以承重100公斤的情况下,有 6 种存放方法。
2. 存放方法 1:
储物格 1:物品1
储物格 2:物品2 物品7
储物格 3:物品3 物品4 物品5 物品6 物品8 物品9 物品10
2. 存放方法 2:
储物格 1:物品1
储物格 2:物品2 物品4 物品6 物品7
储物格 3:物品3 物品5 物品8 物品9 物品10
2. 存放方法 3:
储物格 1:物品1
储物格 2:物品2 物品3 物品5 物品7
储物格 3:物品4 物品6 物品8 物品9 物品10
2. 存放方法 4:
储物格 1:物品1 物品8
储物格 2:物品2 物品4 物品5 物品7 物品9
储物格 3:物品3 物品6 物品10
2. 存放方法 5:
储物格 1:物品1 物品8
储物格 2:物品2 物品3 物品4 物品6 物品7 物品9
储物格 3:物品5 物品10
2. 存放方法 6:
储物格 1:物品1 物品8
储物格 2:物品2 物品3 物品5 物品7 物品9
储物格 3:物品4 物品6 物品10
```
可以看到,在每个储物格可以承重100公斤的情况下,有6种存放方法。其中,存放方法1、2、3需要使用3个储物格,而存放方法4、5、6只需要使用2个储物格。因此,存放方法4、5、6是使用的储物格最少的解法。
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)