這題作為乙個紫題實在是過分了吧。。。
綠的了不起了。
——————————————————————————
看題第一眼,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;
}
應該就是這樣吧。。。
(完)