uva10817(注意輸入的解決)

2021-07-10 22:11:44 字數 865 閱讀 8659

題意:

某校有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個立方體...