洛谷 P1282 多公尺諾骨牌 01揹包

2021-10-04 03:30:37 字數 1447 閱讀 1349

【傳送門】

題目描述

多公尺諾骨牌有上下2個方塊組成,每個方塊中有1~6個點。現有排成行的

上方塊中點數之和記為s1,下方塊中點數之和記為s2,它們的差為|s1-s2|。例如在圖8-1中,s1=6+1+1+1=9,s2=1+5+3+2=11,|s1-s2|=2。

每個多公尺諾骨牌可以旋轉180°,使得上下兩個方塊互換位置。 程式設計用最少的旋轉次數使多公尺諾骨牌上下2行點數之差達到最小。

對於圖中的例子,只要將最後乙個多公尺諾骨牌旋轉180°,可使上下2行點數之差為0。

輸入格式

輸入檔案的第一行是乙個正整數n(1≤n≤1000),表示多公尺諾骨牌數。接下來的n行表示n個多公尺諾骨牌的點數。每行有兩個用空格隔開的正整數,表示多公尺諾骨牌上下方塊中的點數a和b,且1≤a,b≤6。

輸出格式

輸出檔案僅一行,包含乙個整數。表示求得的最小旋轉次數。

輸入輸出樣例

對於有多個物體,每個物體只有兩個狀態的,一般都是01揹包了

定義狀態

dp[i][j] 表示0-i下標號骨牌能夠形成上下差值為j的局面,需要的最少移動次數

注意:

因為這裡骨牌的差值可能是負的,所以用陣列存的話,加乙個偏移量就行,最大值不超過6000,那麼我使用6009作為偏移,即0下標表示差值為-6009,6009下標表示差值為0

狀態轉移:

設上面的數字用n1陣列儲存,下面的用n2陣列

對於第i塊骨牌,如果當前局面的差值是j

dp[i]

[j]=

min(dp[i-1]

[j-n1[i]

-n2[i]

], dp[i-1]

[j-n2[i]

-n1[i]]+

1)

因為列舉的是差值(價值),計算完dp陣列之後,那麼從0往兩邊找差值最小的,且移動次數最小的即可

#include

using

namespace std;

int n1[

1009

], n2[

1009];

int n;

int dp[

1009][

6009*2

];intmain()

i--; j++;}

return0;

}

洛谷 P1282 多公尺諾骨牌

題目描述 多公尺諾骨牌有上下2個方塊組成,每個方塊中有1 6個點。現有排成行的 上方塊中點數之和記為s1,下方塊中點數之和記為s2,它們的差為 s1 s2 例如在圖8 1中,s1 6 1 1 1 9,s2 1 5 3 2 11,s1 s2 2。每個多公尺諾骨牌可以旋轉180 使得上下兩個方塊互換位置...

洛谷p1282多公尺諾骨牌

多公尺諾骨牌有上下2個方塊組成,每個方塊中有1 6個點。現有排成行的 上方塊中點數之和記為s1,下方塊中點數之和記為s2,它們的差為 s1 s2 例如在圖8 1中,s1 6 1 1 1 9,s2 1 5 3 2 11,s1 s2 2。每個多公尺諾骨牌可以旋轉180 使得上下兩個方塊互換位置。程式設計...

洛谷p1282多公尺諾骨牌

大佬的思路 這其實是一道 披著狼皮的揹包題 我們只需要對狀態稍作調整就可以套揹包啦 我們先把骨牌翻轉,調整至點數大的在上面 這樣,我們就能保證上方的點數一定比下方大,並且保證每翻轉一 次,都能使上下的點數之差變小,而變小的點數,就是上下點數之差乘以2。把改變的點數看成物品的體積,初始上下方的點數之差...