傳送門
#include .h>
using namespace std;
using ll = long long;
#define maxn 22
ll dp[
1<;int x[
150]
;ll k[
150]
;int m[
150]
;int d[
150]
;int id[
150]
;ll n,m,b;
intmain()
id[i]
=i;}
sort
(id+
1,id+
1+n,[=
](int x,
int y)
->
bool);
for(
int i=
0;i) dp[i]
=2e18
;//cout=0
; ll ans=dp[1]
; ll inf=ans;
for(
int t=
1;t<=n;t++
) ans=
min(ans,dp[lim-1]
+1ll*b*k[i]);
}if(ans==inf)ans=-1
; cout<}
題意:給你n個物品(n<=24),每個物品有乙個體積viv_i
vi,乙個箱子最多能容納v體積,問最少需要幾個箱子?
#include .h>
using namespace std;
using ll = long long;
#define maxn 24
int d[
1<;int p[
1<;int a[
1<;int s[maxn+3]
;int
lowbit
(int x)
intmain()
int lim=
1
=1;for
(int i=
1;i) s[i]
=s[i-1]
<<1;
for(
int i=
0;i) d[0]
=0; p[0]
=k;for
(int j=
1;j)else
mod += a[cur];if
(cnt < d[j]
|| cnt == d[j]
&& mod < p[j]
) tmp-=cur;}}
cout<-1
<}
卡常數有點毒瘤,首先我用了乙個陣列表示乙個狀態的最小需要體積。
那麼用到的箱子數量就是dp[i]/k+(dp[i]%k>0),但是由於用到了除法常數有點大。
所以我比賽時候被卡了。
正解應該是開兩個陣列。。。。
乙個記錄狀態的箱子數量,乙個記錄狀態的當前使用箱子已用體積。
這樣就可以避免除法了。
然後,這裡有乙個很妙的點在於:
其實這個2^nn得遞推,做到了類似於全排列n!的效果。
即囊括了所有可能的先後順序。
然後這題還卡常數,實測lowbit快於每一位的列舉,這樣才100%通過
*狀壓dp 玉公尺田 狀壓dp
相關 強相關 327.玉公尺田 狀壓dp 小國王 狀壓dp 是井字形,本題是十字形。思路 狀態計算 時間複雜度 n 2 n 2n o n 22n 12 2 24n 2 n 2 n o n2 12 2 n 2n 2 n o n22n 12 224 看著妥妥超時,但是裡面合法狀態很少 依舊可以過 在此,...
狀壓dp小記
鋪磚 題意 現有nm的一塊地板,需要用12的磚塊去鋪滿,中間不能留有空隙。問這樣方案有多少種 include using namespace std typedef long long ll const int maxn 1 11 int n,m,state ll dp 15 maxn s1表示本行...
狀壓dp學習
p2704 炮兵陣地 1038 裁玻璃 狀壓dp是一種非常暴力的做法,列舉所有可能的狀態,找到要求的最佳狀態,與一般dp不同,前一項與後一項有一些複雜的狀態關係。dp的引數 物品個數 行數等 當前狀態 上乙個狀態 將abc的有無表示成乙個8個狀態,列舉所有組,列舉上乙個狀態,得到當前狀態的最優解 i...