問你用以下的數字構建兩個 相同高度的雙塔,盡可能的高。
開始的思路是 揹包計數。
如果 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個物品的各自體積。乙個整數,表示箱子剩...