P1282 多公尺諾骨牌 DP

2022-05-01 17:24:45 字數 1348 閱讀 3489

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

可以將其抽象為揹包問題

揹包問題的核心就是:多放入乙個物件對決策的影響

要求什麼dp什麼

所有dp【i】【j】就是前i個物品 為j點數的最小翻轉次數

要求點數最小 那麼就從j 0-maxn取值即可

#includeusing

namespace

std;

//input

#define rep(i,x,y) for(int i=(x);i<=(y);++i)

#define ri(n) scanf("%d",&(n))

#define rii(n,m) scanf("%d%d",&n,&m);

#define riii(n,m,k) scanf("%d%d%d",&n,&m,&k)

#define rs(s) scanf("%s",s)

#define ll long long

#define rep(i,n) for(int i=0;i

#define clr(a,v) memset(a,v,sizeof a)

/////////////////////////////////

/#define n 8000

#define inf -0x3f3f3f3f

int dp[1005][2*n+5

];int

main()

} rep(i,

0,n-1)

}

P1282 多公尺諾骨牌 DP

題目大意 題解當知道 總和 及 單行的和 就可以算出差值的大小 1 2 3 4 單行和l 10 8 7 6 5 總和s 36 則上下行的差值為 l s l include define inf 0x3f3f3f3f using namespace std int n,a 1005 b 1005 dp...

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 使得上下兩個方塊互換位置。程式設計...