洛谷 P2392 kkksc03考前臨時抱佛腳

2021-10-16 19:20:59 字數 1568 閱讀 4013

因為資料的範圍不大,可以直接的搜尋,也可以使用01揹包解題
對於乙個問題,要麼加在左腦,要麼加在右腦;搜尋所有這樣的組合,選取左右腦中最大的,所有組合最小的時間就是解該科目問題的最短時間。再把四科的時間加起來就是答案。

**沒有使用任何的剪枝也能過

#include

#include

#include

#define inf 0x3f3f3f3f

using

namespace std;

const

int maxn =30;

int a[maxn]

;int s[5]

;int left,right;

int minn;

void

dfs(

int cur,

int i)

left +

= a[cur]

;dfs

(cur+

1, i)

; left -

= a[cur]

; right +

= a[cur]

;dfs

(cur+

1, i)

; right -

= a[cur];}

intmain()

dfs(

0, i)

; ans +

= minn;

} cout

}

對於一科的所有問題,如果每個問題的時間加起來等於sum,那麼解決這一科問題所有的理想時間是sum/2(相當於左右腦平均分),但是一般不會這麼恰好的平均分。所以我們希望對於單獨的乙個腦子,時間越接近sum/2越好(小於等於sum/2),這樣另一半的腦子所用的時間就是解決這一科問題所用的時間。(選取左右腦時間長的那乙個作為解決這一科的時間)。

這樣就轉換成了01揹包問題,揹包的容量是sum/2,每個問題的占用空間和價值相同。

#include

#include

#include

#include

#define inf 0x3f3f3f3f

using

namespace std;

const

int maxn =30;

int s[5]

;int dp[

5000];

int a[maxn]

;int

main()

memset

(dp,0,

sizeof

(dp));

int maxx =

-inf;

//01揹包

for(

int j=

0;j;j++)}

ans +

= sum - dp[sum/2]

;//另一半腦子的時間才是這一科所話的時間

} cout

}

洛谷 P2392 kkksc03考前臨時抱佛腳

kkksc03 的大學生活非常的頹廢,平時根本不學習。但是,臨近期末考試,他必須要開始抱佛腳,以求不掛科。這次期末考試,kkksc03 需要考 44 科。因此要開始刷習題集,每科都有乙個習題集,分別有 s 1,s 2,s 3,s 4s1 s2 s3 s4 道題目,完成每道題目需要一些時間,可能不等 ...

洛谷 P2392 kkksc03考前臨時抱佛腳

kkksc03的大學生活非常的頹廢,平時根本不學習。但是,臨近期末考試,他必須要開始抱佛腳,以求不掛科。這次期末考試,kkksc03需要考4科。因此要開始刷習題集,每科都有乙個習題集,分別有s1,s2,s3,s4道題目,完成每道題目需要一些時間,可能不等 a1.as1,b1.bs2,c1.cs3,d...

P2392kkksc03考前臨時抱佛腳

一.題目描述 二.解題思路 剛開始一直有個錯覺,以為左右腦做個貪心就可以了,一交全wa,不信,再交一邊,又全wa,然後我突然想到了以前學dp的時候,做過乙個類似於求解陣列分成兩部分求和最小題目,這個應該就是那個題目的變形,然後我就開始上模板了,一頓cv,交上去莫名ac。三.實現 1 include ...