当有1个属性时,我确实理解那里发生了什么。 当有超过1个属性时,我遇到了解背包问题的问题。
我必须编写一个使用带有2个属性的背包算法的程序。老师告诉我们,它必须在一个3d数组中完成。我无法想象这样的阵列会是什么样的。
让我们说这是我的意见:
4 3 4 // number of records below, 1st property of backpack, 2nd property of backpack
1 1 1 // 1st property, 2nd property, cost
1 2 2 // 1st property, 2nd property, cost
2 3 3 // 1st property, 2nd property, cost
3 4 5 // 1st property, 2nd property, cost
输出看起来像那样:
4 // the cheapest sum of costs of 2 records
1 3 // numbers of these 2 records
输出说明: 2组记录适合第1行输入:
(1) - 记录编号1和记录编号3
1 1 1
+ 2 3 3
-------
3 4 4
(2) - 记录编号4
3 4 5
因为第一组记录是最便宜的(4 <5),所以我们选择了它。不仅我必须知道这些记录是否存在,我还必须找到我总结的记录。
但是现在,我只需要了解,3d数组将如何显示。你们中的一些人可以帮我解决这个问题并逐层展示,就像我的形象一样,这会是什么样子? 感谢。
答案 0 :(得分:1)
你正在尝试做一些不可能的事情 - 这是你的问题。
当您添加尺寸数量时,您的商品会获得其他属性。因此,您可以使用矩形边(prop1
x prop1
)或块边prop2
x {{1}而不是表格的左侧列((prop1
) } x prop2
)等等。但是,定义表的上部,行侧的现有约束应具有相同的维数。 不仅仅是一个维度!。因此,您将从不能够将双属性问题放入三维块中,而您需要4D块。 6D块为3个属性,依此类推。
答案 1 :(得分:1)
假设您使用的是三维表格:A[x][y][z]=k
,x
:sum 1st property; y
:求和第二财产; z
:加第3财产; k:最低成本(最高奖励,我更喜欢使用奖励)
所以你迭代项目。说当前项目是(p1,p2,p3,奖励)(奖励= - 费用)。对于每个(x,y,z,k)
,您的更新公式为:
A[x+p1][y+p2][z+p3] = max(A[x+p1][y+p2][z+p3], A[x+p1][y+p2][z+p3] + reward)
如果RHS上的第一个术语更长,则在A[x+p1][y+p2][z+p3]
位上,背包的配置保持不变;否则,你用A[x+p1][y+p2][z+p3]
加上当前项目更新背包。
希望这能把事情搞清楚。