題意:
給出n個人,m道題;每道題只能乙個人做;現在給出n行m列.是每個人做每一道題的成功率;
你現在要選出哪些人做哪些題,使成功率和最大.但是有乙個條件做到任意一題時,做最多的人只能比做最少的人多做一道;
就是如果10個人,那麼前10題必須一人一題;
思路:因為限制條件,所以前n道題,必須分給n個人一人一道,那麼每人只能做一次;
那麼用狀態壓縮表示哪些人做過了;
比如5個人00110;那麼下一道題就可以選擇剩下的3個人做,並且比較出乙個最優的選擇;
當狀態變成11111時,就要重新置零;
所以用乙個dp[i][j]表示前i道題,已經做的人的狀態是j;
#include
#include
#include
using namespace std;
double p[15][1005];
double dp[1005][1 << 10];
int n,m;
double solve()
} dp[0][0] = 0;
for(int i = 0; i < m; i++)
} }double ans = 0.0;
for(int i = 0; i < (1 << n); i++)
return ans;
}int main()
} printf("case #%d: %.5lf\n",cas++, solve());
}}
Hdu 3811 狀態壓縮 DP
題意 給定數n n 17 求乙個n位數,每位可選1 n中的乙個,且每位不同,並且滿足給定的條件,求方案數。給定條件為m個 x y 表示第x位為y的滿足要求。滿足m中的乙個條件即正確。演算法 dp 狀態壓縮 分析 首先不考慮條件的總方案數為n 我們先算不滿足條件的方案,因為m個條件之間是或者 關係,有...
hdu 1074 狀態壓縮dp
題目描述 有 n 門課程的作業,每門都有完成期限d,與完成所需時間c,若超過期限,1天扣1分。問完成這n門作業至少要扣多少分,並輸出扣分最少的做作業順序。思路 dp i 記錄完成狀態為i的情況下的資訊。完成所需時間,上乙個狀態,最小扣分 狀態方程 dp i min dp j cost j,i 從j狀...
hdu1565 dp狀態壓縮
題意 給你乙個n n的格仔的棋盤,每個格仔裡面有乙個非負數。從中取出若干個數,使得任意的兩個數所在的格仔沒有公共邊,就是說所取的數所在的2個格仔不能相鄰,並且取出的數的和最大。解題思路 先找出所有能成立的狀態,即 i i 1 0,表示每一行都沒有相鄰的,然後遍歷if q j 1 再進行動態更新,用上...