NKOJ3701 分享巧克力 狀態壓縮

2021-08-20 10:32:18 字數 1593 閱讀 8581

問題描述

給你一塊長為x,寬為y的矩形巧克力。你可以對巧克力進行任意次下列操作:

每次操作可以沿一條直線把一塊巧克力切割成兩塊巧克力,要求切出的兩塊巧克力的長和寬都是整數。

問:是否可以經過若干次上述操作,恰好得到n塊面積分別為a1,a2,…,an的巧克力(巧克力要恰好用完,不能夠有剩餘)。如下圖所示,給出你一塊3*4的巧克力,我們可以將其切割成面積為1,2,3,6的四塊巧克力。

輸入格式

第一行,乙個整數n,表示要求切割出的巧克力的塊數。

第二行,兩個整數x和y,表示初始巧克力的長和寬

第三行,n個空格間隔的整數,表示n塊指定的巧克力的面積a1,a2,…,an

輸出格式

一行,若能夠切割成功輸出」yes」,否則輸出」no」

樣例輸入 1

4 3 4

6 3 2 1

樣例輸出 1

yes如果只標記巧克力的面積,會發現資訊量不足。因為可能該面積存在一種合法分割方式,但是這種分割方式已經不能夠用於當前巧克力(比如面積為6的巧克力需要被分成2∗

3 2∗3

,但是現在只有一塊1∗

6 1∗6

的巧克力)。

所以需要再加一維資訊,用來確定巧克力的形狀。

設當前狀態為f[i][x],表示面積為i的巧克力的長為x. 比如對於樣例,面積為

(1010)2

(

1010)2

表示選中了面積為6和2的巧克力。

乙個顯然的結論是:如果乙個矩形能被分成另外兩個同寬或同長的矩形,那麼這個矩形一定存在。所以,當以下兩種情況成立的時候原矩陣能夠切割成功(設寬為y):

f[k][x]==true && f[i^k][x]==true(k belongs to i)

f[k][y]==true && f[i^k][y]==true(k belongs to i)

#include

#include

#include

#include

using

namespace

std;

int nn,n,mark[(1

<<15)+5],f[105][(1

<<15)+5],s[20];

int lowbit(int x)

//也可以定成dfs(x,y,s)

bool dfs(int x,int s)

for(int s1=(s-1)&s;s1;s1=(s1-1)&s)

if(mark[s1]%y==0)

if(dfs(min(y,mark[s1]/y),s1))

if(dfs(min(y,mark[s2]/y),s2))

}return0;}

int main()

if(dfs(x,nn))puts("yes");else

puts("no");

return

0;}

1123分享總結

var jsondata function createtree jsons,subnetnode return ul function function factorial num else var truefactorial factorial factorial function alert ...

12 10分享會心得

有幸參加了ucai組織的一場分享會,感覺收穫還是蠻大的,不僅見識到了許多大牛,還獲得了一些學習方法,收穫頗豐!在這裡我見到了php的swoole擴充套件的開發者王晶 半桶水,也見到了熊家貴這樣的android大牛,以及各種ceo和cto。後面也聽了一些優秀者的分享會,感覺他們的經歷都挺傳奇的,日後必...

Openssl EVP 說明三 分享

openssl之evp系列之6 evp encrypt系列函式程式設計架構及例子 在前面的兩篇文章,已經對evp encrypt 系列函式做了詳細的介紹,本章將說明該系列函式通用的應用架構,並舉幾個函式應用例子。應用架構 一般來說,evp encrypt 系列函式的應用架構如下所描述 假設加密演算法...