偽紫題p5194 天平(dfs剪枝)

2022-06-03 21:18:09 字數 942 閱讀 1735

這題作為乙個紫題實在是過分了吧。。。

綠的了不起了。

——————————————————————————

看題第一眼,01揹包無誤。2min打好一交全屏紫色(所以這就是這題是紫色的原因233?)

re原因:即使壓掉一維,dp陣列的下標也有1e10 * 2 以上,不mle就不錯了。

肯定是動態規劃一類的東西了。根據題目這一句話:這一行中從第3個砝碼開始,每個砝碼的質量至少等於前面兩個砝碼(也就是質量比它小的砝碼中

質量最大的兩個)的質量的和。是不是很像斐波那契?於是推出來:n的真實值其實也很小,大約在30左右吧。但是樸素搜尋也會原地爆裂。

怎麼剪枝呢?大約有三個剪枝。

#1:輸入的時候,如果當前的重量已經大於限制了,就停止,把砝碼總數重新定義。

#2:題目裡所有的砝碼都是單調遞增的,所以不會出現去掉前面某乙個砝碼然後取後面乙個來找到最大值(可能表述有些問題,或者我根本理解錯了,歡迎指正)所以維護乙個字首和,如果這個能拿,就把前面的全都拿了(或者說當前的砝碼一定大於等於前面所有的砝碼重量和)

#3:因為找最大,所以從後往前搜尋。

大概就是這樣。

#include//變數解釋:a陣列存題目給定值,b陣列為字首和陣列,n為砝碼數量,m為限制重量

using namespace std;

const int maxn=500005;

int n,m;

long long ans,a[maxn],b[maxn];

void dfs(int now,long long ma)//當前砝碼序號和最大值

int main()

b[i]=b[i-1]+a[i];//剪枝#2

}  dfs(n,0);

printf("%lld",ans);

return 0;

}

應該就是這樣吧。。。

(完)