这题,简单的01背包问题。
只是一开始没有想到,觉得这题莫名其妙的。还是太水。
下面的是AC的代码:
#include <iostream> #include <cstdio> using namespace std; class data { public: int cost; double pre; }; data Da[10005]; double dp[10005]; //拿到offer的概率 int M, N; double max(double a, double b) { return a > b ? a : b; } void DP() { for(int i = 0; i < M; i++) { for(int j = N; j >= Da[i].cost; j--) //不断更新拿到的概率 { dp[j] = max(dp[j], 1 - (1 - dp[j - Da[i].cost]) * (1 - Da[i].pre)); } } } int main() { while(cin >> N >> M && (M + N)) { for(int i = 0; i < M; i++) cin >> Da[i].cost >> Da[i].pre; for(int j = 0; j <= N; j++) dp[j] = 0; DP(); printf("%.1lf%%\n", dp[N] * 100); } return 0; }
杭电ACM1203——I NEED A OFFER!~~01背包
原文地址:http://blog.csdn.net/qq_25425023/article/details/45932875