vijosp1037 類揹包問題 好題 搭建雙塔

2021-08-08 11:48:30 字數 1026 閱讀 9143

問你用以下的數字構建兩個 相同高度的雙塔,盡可能的高。

開始的思路是 揹包計數。

如果 dp[m] 和dp[m/2] 和m%2==0 都滿足,那麼我們就可以輸出m/2

(m和 m/2 這些數字都能拼出來。。)

但是即使這樣,其實也不一定是可以的,因為很可能 m/2構成的兩次使用了重疊的項,而我們並沒有阻止這一種情況

// 這時錯誤的**。過了不到一半的資料qwq

#include

using

namespace

std;

const

int maxn=3000;

int a[maxn];

int dp[maxn];

int m;

int main()

memset(dp,0,sizeof(dp));

dp[0]=1;

for(int i=0;ifor(int j=sum;j>=a[i];j--)

dp[j]+=dp[j-a[i]];

}int x=sum;

while(1)

else

x--;

}return

0;}

正解是 類似揹包的dp

dp[i][j] 表示使用了1-i個數字,兩個塔差值為j時候 矮塔的個數。

#include using namespace std;

const int inf=0x3f3f3f3f;

const int maxn=3000;

int a[maxn];

int dp[2][maxn];

int m;

int main()

for(int i=0;i<2;i++)

}bool flag=false;

if(dp[(m)%2][0])

if(!flag)

puts("impossible");

return

0;}

VIJOS P1037 搭建雙塔

2001年9月11日,一場突發的災難將紐約世界 中心大廈夷為平地,mr.f曾親眼目睹了這次災難。為了紀念 9?11 事件,mr.f決定自己用水晶來搭建一座雙塔。mr.f有n塊水晶,每塊水晶有乙個高度,他想用這n塊水晶搭建兩座有同樣高度的塔,使他們成為一座雙塔,mr.f可以從這n塊水晶中任取m 1 m...

Vijos P1037 搭建雙塔

p1037搭建雙塔 accepted 2001年9月11日,一場突發的災難將紐約世界 中心大廈夷為平地,mr.f曾親眼目睹了這次災難。為了紀念 9?11 事件,mr.f決定自己用水晶來搭建一座雙塔。mr.f有n塊水晶,每塊水晶有乙個高度,他想用這n塊水晶搭建兩座有同樣高度的塔,使他們成為一座雙塔,m...

Vijos P1133 裝箱問題 01揹包

有乙個箱子容量為v 正整數,o v 20000 同時有n個物品 o n 30 每個物品有乙個體積 正整數 要求從 n 個物品中,任取若千個裝入箱內,使箱子的剩餘空間為最小。第一行,乙個整數,表示箱子容量 第二行,乙個整數,表示有n個物品 接下來n行,分別表示這n個物品的各自體積。乙個整數,表示箱子剩...