多公尺諾骨牌有上下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:
46 11 5
1 31 2
#include using namespace std;
int f[12005];
int a[1005];
int n;
int main()
f[s+s1]=1;
for(i=0;i0)
for(j=t;j<=k;j++)
if(f[j]>0&&(f[j-t]==0||f[j-t]>f[j]+1))
f[j-2*a[i]]=f[j]+1;
if(a[i]<0)
for(j=k+t;j>=0;j--)
if(f[j]>0&&(f[j-t]==0||f[j-t]>f[j]+1))
f[j-t]=f[j]+1;//分2種情況考慮
} m=n=s1;
while(f[m]==0&&f[n]==0)
if(f[m]==0)
cout<=f[m])
cout<
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 多公尺諾骨牌
p1282多公尺諾骨牌 這個題其實挺水的,主要是對於這個狀態的理解 1.dp i j dp i j a i b i 2.dp i j dp i j b i a i 1 兩個狀態取乙個min就行了。為什麼這樣的轉移是合理的呢。我們規定上面一半的點數為a i 下面一半的點數為b i 那麼首先我們看 1....
P1282 多公尺諾骨牌
problem 此題是一道01揹包。關於01 揹包 我不想講了 my blog 這道題是一道基礎的01揹包問題 設f i j k表示前i張牌構成分值j的最小次數k 設 dis a i b i 不反轉 f i j dis n min f i j dis n f i 1 j n 反轉 f i j dis...