因為資料的範圍不大,可以直接的搜尋,也可以使用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 ...