kkksc03的大學生活非常的頹廢,平時根本不學習。但是,臨近期末考試,他必須要開始抱佛腳,以求不掛科。
這次期末考試,kkksc03需要考4科。因此要開始刷習題集,每科都有乙個習題集,分別有s1,s2,s3,s4道題目,完成每道題目需要一些時間,可能不等(a1...as1,b1...bs2,c1...cs3,d1...ds4)。
kkksc03有乙個能力,他的左右兩個大腦可以同時計算2道不同的題目,但是僅限於同一科。因此,kkksc03必須一科一科的複習。
由於kkksc03還急著去處理洛谷的bug,因此他希望盡快把事情做完,所以他希望知道能夠完成複習的最短時間
輸入格式:
本題包含5行資料:第1行,為s1,s2,s3,s4(1≤s1,s2,s3,s4≤20)
第2行,為a1...as1 共s1個數,表示第一科習題集每道題目所消耗的時間。
第3行,為b1...bs2 共s2個數,
第4行,為c1...cs3 共s3個數,
第5行,為d1...ds4 共s4個數,意思均同上。
(1≤a1...as1,b1...bs2,c1...cs3,d1...ds4≤60)
輸出格式:
輸出一行,為複習完畢最短時間。
輸入樣例#1:複製
1 2 1 354 3
62 4 3
輸出樣例#1:複製
20
題目思路就是每科所花的時間最好是越接近總的題目時間的1/2,因為他兩道題一起做。相當於揹包容量為總的1/2,而最多所裝的題的時間。有多少科目就有幾個揹包。
當每個科目都最接近1/2時所花的時間是最少。
**如下:(其實就是多個01的組合)
#include
#include
using namespace std;
#define n 3000
int max(int a, int b)
int dp[n];
int s[5];
int w[5][21];
int main()
int sum = 0;
for (int i = 1; i <= 4; i++)
sum += all - dp[all >> 1]; all = 0;
memset(dp, 0, sizeof(dp));
}cout << sum << endl;
return 0;
}
揹包 01揹包
01揹包 有n種物品與承重為m的揹包。每種物品只有一件,每個物品都有對應的重量weight i 與價值value i 求解如何裝包使得價值最大。dp i,v 表示前i個物體 包括第i個 面對容量為v的揹包的最大價值,c i 代表物體i的重量,w i 代表物體i的價值 如果第i個物體不放入揹包,則揹包...
揹包 01揹包,完全揹包,多重揹包
哈哈 01揹包 f i v max 完全揹包 f i v max 多重揹包 f i v max include include include include include define maxn 1000 using namespace std int n,cap int w maxn 重量 花...
01揹包 完全揹包 多重揹包
01揹包 zeroonepack 有n件物品和乙個容量為v的揹包,每種物品均只有一件。第i件物品的費用是c i 價值是w i 求解將哪些物品裝入揹包可使價值總和最大。include include includeusing namespace std const int n 1000 10 int ...