UVA 10817 校長的煩惱

2021-09-02 11:46:55 字數 547 閱讀 9662

根據s的範圍我們可以考慮集合dp,一種相對容易的方法是用集合s1表示恰好有乙個人教授的科目集合,s2表示至少有兩個人教授的科目集合,f(i,s1,s2)表示已經考慮了前i個人時的最小花費。狀態轉移方程為:

f(i,s1,s2)=min其中第一種情況是聘用第i個人,第二種為不聘用。這裡要注意第二種情況當且僅當i>=m+1才能討論

這道題記憶化搜尋比較舒服,我們可以在搜尋的引數中加入s0,表示沒有任何人能教的課程集合方便我們討論

#include#include#include#includeusing namespace std;

const int maxs=(1<<8);

const int inf=0x3f3f3f3f;

int p[125],cost[125],f[125][maxs][maxs],s,n,m,s;

int dp(int i,int s0,int s1,int s2)

int main()

} memset(f,-1,sizeof(f));

cout<}}

uva10817(注意輸入的解決)

題意 某校有n個教師和m個求職者,需要講授s個課程 1 s 8,1 m 20,1 n 100 已知每人的工資c 10000 c 50000 和能教的課程集合,要求支付最少的工資使得每門課都至少有兩名教師教學。在職教師不能辭退。分析 狀態壓縮dp,0 1揹包問題,對於求職者要麼選要麼不選,用兩個集合s...

UVa 10817 狀壓 記憶化搜尋

描述 m個教師,n個求職者,s門課程.每門課程至少需要2個老師教,問符合要求的最小值 分析 首先定義狀態 對於每乙個老師只有教或者不叫兩種決策,而方程想要轉移,很容易看出需要知道此時老師教授的情況.故 定義 f i s1 s2 i表示依考慮到前i個老師 s1為乙個老師教的集合 s2為兩個老師教的集合...

狀壓dp UVA 10817 校長的煩惱

題目大意 思路 思路比較容易明白,就是 比較不容易寫,對位運算必須非常熟悉。include using namespace std int st 150 int fy 150 int s,n,m int dp 150 1 8 1 1 8 1 intdfs int i,int s0,int s1,in...