洛谷P1282 多公尺諾骨牌

2022-05-24 06:18:12 字數 1391 閱讀 1058

多公尺諾骨牌有上下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。

輸出格式:

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

輸入樣例#1: 

4

6 11 5

1 31 2

輸出樣例#1: 

1

我們先把骨牌翻轉,調整至點數大的在上面

這樣,我們就能保證上方的點數一定比下方大,並且保證每翻轉一 次,都能使上下的點數之差變小,而變小的點數,就是上下點數之差乘以2。

把改變的點數看成物品的體積,初始上下方的點數之差看做揹包體積,不難看出揹包問題的模型。

那麼物品的重量是什麼呢?

因為我們一開始就把點數大的放在了上面,而每放一次,翻轉次數就+1。考慮:要是我後來後悔了,我發現不翻這個骨牌更好怎麼辦?那我會把它翻回來,那麼相當於沒有翻這個骨牌。

因此,一開始翻過的骨牌重量就是-1,未翻過的骨牌重量就是1(重量等價於翻轉次數)

當然,上下相同的骨牌就是體積為0,重量為0的物品,因為他們無論怎麼翻,都不會對上下點數差造成影響。

至此,揹包的模型就出來了。這個問題被簡化成:有n個物品,給出每個物品的體積v[i],他們的重量是1或-1。揹包的重量為sum,體積為tot,現在請把這n個物品放到揹包裡去,總體積不能超過tot,體積最大的情況下使得物品重量之和最小。

其中,f[i][j]表示前i件物品能裝到體積為j的最小重量

s[i][j]表示前i件物品能否裝到j體積

**#include

#include

#include

#include

using namespace std;

int v[10001],w[10001],sum,tot,ans;

int f[1001][6005],s[1001][6005];

int main()

if(x=1;i--)

if(s[n][i])

return 0;

}

洛谷 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。把改變的點數看成物品的體積,初始上下方的點數之差...