題意:
某校有n個教師和m個求職者,需要講授s個課程(1<=s<=8,1<=m<=20,1<=n<=100).已知每人的工資c(10000<=c<=50000)和能教的課程集合,要求支付最少的工資使得每門課都至少有兩名教師教學。在職教師不能辭退。
分析:
狀態壓縮dp,0-1揹包問題,對於求職者要麼選要麼不選,用兩個集合s1表示恰好有乙個人教的科目集合,s2表示至少有兩個人教的科目的集合,而d[i][s1][s2]表示前i個人的最小花費。狀態轉移方程為d[i][s1][s2]=min(dp(i+1,s0,s1,s2),a[i]+dp(i+1,s0,s1,s2))(當i>=m時)。
最終的結果是dp(0,1<<(s-1),0,0)。
附劉汝佳**:
#include
#include
#include
#include
using
namespace
std;
const
int maxn = 100 + 20 + 5;
const
int maxs = 8;
const
int inf = 1000000000;
int m, n, s, c[maxn], st[maxn], d[maxn][1
<1
int dp(int i, int s0, int s1, int s2)
int main()
memset(d, -1, sizeof(d));
cout
<< dp(0, (1
<1, 0, 0) << "\n";
} return
0;}
UVA 10817 校長的煩惱
根據s的範圍我們可以考慮集合dp,一種相對容易的方法是用集合s1表示恰好有乙個人教授的科目集合,s2表示至少有兩個人教授的科目集合,f i,s1,s2 表示已經考慮了前i個人時的最小花費。狀態轉移方程為 f i,s1,s2 min其中第一種情況是聘用第i個人,第二種為不聘用。這裡要注意第二種情況當且...
UVa 10817 狀壓 記憶化搜尋
描述 m個教師,n個求職者,s門課程.每門課程至少需要2個老師教,問符合要求的最小值 分析 首先定義狀態 對於每乙個老師只有教或者不叫兩種決策,而方程想要轉移,很容易看出需要知道此時老師教授的情況.故 定義 f i s1 s2 i表示依考慮到前i個老師 s1為乙個老師教的集合 s2為兩個老師教的集合...
UVA 1352 注意暴的角度
本題旋轉方法很特別,先確定右旋和上旋,則每個面朝上都可以通過這兩種操作實現 再者,是暴力的角度,要從最優解出發,肯定可以確定的是每個立方體都為24種旋轉方案中的一種 則不如取第乙個 只採用 24種旋轉方式中的一種,然後列舉其他立方體的旋轉方式,然後既然狀態確定的情況下,就好統計了,每個面取n個立方體...