Problem-W

来源:互联网 发布:csmar数据库分红数据 编辑:程序博客网 时间:2024/05/01 19:33

概述:提交offer,每提交一份需要花一定的金额,然后有一定的几率拿到offer,现在一共有一定的金额,问在金额允许的情况下拿到offer的几率是多少。

思路:dp中的01背包问题,推导状态转移方程:dp[j] = min(dp[j], dp[j - money[i]] * offer[i]);然后这道题跟别的比起来有意思的是不直接求所求数据,用1去减,然后结果在减,间接求。

感想:提交第一遍的时候在自己这的编译器不知道怎么崩掉,然后抱着试试的态度提交,runtime。。检查了一下代码,有一处小错误,但是只是在循环内少取了一个数字,影响不大,重写代码后提交第一次忘记控制输出格式,改正后ac,但是不理解第一次为什么出问题,这种已经好几次了。。。重写后通过,不懂。。

#include<iostream>#include<fstream>#include<cmath>#include<string.h>#include<algorithm>int min(int a, int b){return a < b ? a : b;}#define M 10005double dp[M], offer[M];int money[M];using namespace std;int main(){//ifstream cin("in.txt");int n, m;while (cin >> n >> m,m+n){for (int i = 0;i < M;i++)dp[i] = 1;for (int i = 1;i <= m;i++){cin >> money[i] >> offer[i];offer[i] = 1 - offer[i];}for (int i = 1;i <= m;i++)for (int j = n;j >= money[i];j--)dp[j] = min(dp[j], dp[j - money[i]] * offer[i]);dp[n] = (1 - dp[n]) * 100;printf("%.1lf%%\n", dp[n]);}return 0;}


0 0
原创粉丝点击