#16926: 這一題的解題方向


rollfc (胖胖貓)

學校 : 國立清華大學
編號 : 81012
來源 : [36.229.36.84]
最後登入時間 :
2024-05-04 14:24:04
c264. 神奇的載物任務 | From: [140.113.208.164] | 發表日期 : 2019-02-22 00:00

題目的原型應該是 01 背包問題,只是原本的重量限制變成了力矩限制。

雖然可以 GOOGLE 到解法( 感謝 傑克的程式區 的說明 ),但是對於解法說明我還是一知半解。

我自己的認知是既然是從 01 背包問題演變而來,那解法的部分應該也是:

在 01 背包問題解法的一維陣列實作時是枚舉所有的重量,陣列存的值是當重量=陣列位置時可獲得的最大價值

對應到這題給的限制是力矩,力矩=長度X重量,所以這題會改為枚舉兩個維度:長度和力矩

更新方式也是從由大往小更新,所以套用到二維上自然也是長度和力矩各自由大到小更新。

只是在處理 01 背包時並不會做排序後從重量最重開始更新陣列,但這題的做法卻是必須的?!

傑克的程式區的說明:希望體積越重的物品放在離支撐點越近的地方,這個說明是對的但不足以說明排序是必須的

如果不排序就直接去更新二維陣列得到錯誤的答案,自己手動產生兩筆小測資對於有無排序都不受影響,

想問一下其他有解開或是看懂解法的大大們對於排序是必然的說明,先謝謝各位的回覆。

 
#19766: Re:這一題的解題方向


99st60107 (林子傑)

學校 : 新北市立板橋高級中學
編號 : 43060
來源 : [124.218.109.240]
最後登入時間 :
2024-04-01 23:00:57
c264. 神奇的載物任務 | From: [114.45.51.237] | 發表日期 : 2019-10-28 20:03

題目的原型應該是 01 背包問題,只是原本的重量限制變成了力矩限制。

雖然可以 GOOGLE 到解法( 感謝 傑克的程式區 的說明 ),但是對於解法說明我還是一知半解。

我自己的認知是既然是從 01 背包問題演變而來,那解法的部分應該也是:

在 01 背包問題解法的一維陣列實作時是枚舉所有的重量,陣列存的值是當重量=陣列位置時可獲得的最大價值

對應到這題給的限制是力矩,力矩=長度X重量,所以這題會改為枚舉兩個維度:長度和力矩

更新方式也是從由大往小更新,所以套用到二維上自然也是長度和力矩各自由大到小更新。

只是在處理 01 背包時並不會做排序後從重量最重開始更新陣列,但這題的做法卻是必須的?!

傑克的程式區的說明:希望體積越重的物品放在離支撐點越近的地方,這個說明是對的但不足以說明排序是必須的

如果不排序就直接去更新二維陣列得到錯誤的答案,自己手動產生兩筆小測資對於有無排序都不受影響,

想問一下其他有解開或是看懂解法的大大們對於排序是必然的說明,先謝謝各位的回覆。



附上[該題網址](https://allem40306.github.io/blog/posts/3b76/]

 
#23360: Re:這一題的解題方向


rk427454171@gmail.com (Ji_Kuai)

學校 : 不指定學校
編號 : 99145
來源 : [118.166.212.206]
最後登入時間 :
2021-02-06 03:33:51
c264. 神奇的載物任務 | From: [118.166.215.172] | 發表日期 : 2020-11-10 01:37

題目的原型應該是 01 背包問題,只是原本的重量限制變成了力矩限制。

雖然可以 GOOGLE 到解法( 感謝 傑克的程式區 的說明 ),但是對於解法說明我還是一知半解。

我自己的認知是既然是從 01 背包問題演變而來,那解法的部分應該也是:

在 01 背包問題解法的一維陣列實作時是枚舉所有的重量,陣列存的值是當重量=陣列位置時可獲得的最大價值

對應到這題給的限制是力矩,力矩=長度X重量,所以這題會改為枚舉兩個維度:長度和力矩

更新方式也是從由大往小更新,所以套用到二維上自然也是長度和力矩各自由大到小更新。

只是在處理 01 背包時並不會做排序後從重量最重開始更新陣列,但這題的做法卻是必須的?!

傑克的程式區的說明:希望體積越重的物品放在離支撐點越近的地方,這個說明是對的但不足以說明排序是必須的

如果不排序就直接去更新二維陣列得到錯誤的答案,自己手動產生兩筆小測資對於有無排序都不受影響,

想問一下其他有解開或是看懂解法的大大們對於排序是必然的說明,先謝謝各位的回覆。


如果你只是要測資的話

2 4 2

1 1

2 1

最佳解是第二個物品放第一格 第一個物品放第二格 答案為2

至於原因 有點貪心的成分

首先要知道背包的dp解法有個問題就是: 在後面被考慮到的物品肯定得在前面的物品後面(才符合dag)

然而有時候(例如上面測資) 後面的物品一定得在前面才比較好 至於條件如下

考慮兩個重量為ma mb的物品 假設ma<=mb 且a肯定在b的前面

則獲得力矩為vama + vbmb (va < vb)

但如果交換順序 vamb+vbma

拿去減(vamb+vbma) - (vama+vbmb) = va(mb - ma) + vb(ma - mb) = (mb - ma)(va - vb)

由於ma-mb >= 0且va-vb < 0 因此交換後-交換前 <= 0 也就是交換後的力矩肯定不會比交換前的力矩大

 
ZeroJudge Forum