博客 > 数据结构&算法 > 题目&比赛
# HDU 1203(01背包) [HDU-1203](http://acm.hdu.edu.cn/showproblem.php?pid=1203) ## 题目分析 也是一道01背包问题. 不过价值的最优解变成了概率的最优解. 根据概率论的有关知识, 想求出多个条件中**至少满足一个**的概率, 其实等同于求**1 - 每个都不满足**的概率. 因此将$dp[i][j]$定义为: **申请到第$i$所学校, 花费$j$万元时, 每个学校都不满足的概率**. 同时注意, 初值应该为1. 得出状态转移方程. ## 转移方程 $$ \begin{align} dp[i][j] = \begin{cases} 1, &i = 0 || j = 0\\ dp[i-1][j], &j \lt w[i]\\ max(dp[i-1][j], dp[i-1][j-cost[i]] * (1 - chance[i])), &其他 \end{cases} \end{align} $$ ## 代码(C++) ```c++ #include <cstdio> #include <algorithm> using namespace std; int main() { int N, M; while(~scanf("%d%d", &N, &M)) { if (N == 0 && M == 0) break; int cost[10005]; double chance[10005], dp[10005]; fill(dp, dp + N + 1, 1); for(int i = 1; i <= M; ++i) scanf("%d%lf", &cost[i], &chance[i]); for(int i = 1; i <= M; ++i) for(int j = N; j >= cost[i]; --j) dp[j] = min(dp[j], dp[j - cost[i]] * (1 - chance[i])); printf("%.1lf%%\n", 100 * (1 - dp[N])); } } ```