HDU1203 DP 01背包问题

思路:01背包

首先因为是n <= 10000, m <= 10000所以n*m开成数组就一定Memory out了,所以就只能开一维数组。

然后是因为两个for循环n*m太大了,10000^2肯定TLE,然后我想着肯定就是n*logn的数据了,想了半天没想出来,感觉这道题目有问题,结果用n*n的数据竟然过了。表明这道题目数据有点水吧。

不过作为例题来做还是很经典的


#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int n, m; struct offer{ int ex; double chance; }sch[10000 + 50]; double dp[10000 + 50]; double pro(double a, double b){ double sum = 1.0 - (1.0 - a) * (1.0 - b); return sum; } void solve(){ memset(dp, 0, sizeof(dp)); for (int i = 0; i < m; i++){ for (int j = n; j >= sch[i].ex; j--){ dp[j] = max(dp[j], max(dp[j - sch[i].ex], pro(sch[i].chance, dp[j - sch[i].ex]))); } } printf("%.1f%%\n", dp[n] * 100); } int main(){ while(scanf("%d%d", &n, &m) != EOF){ if (n == 0 && m == 0) break; memset(sch, 0, sizeof(sch)); for (int i = 0; i < m; i++){ scanf("%d%lf", &sch[i].ex, &sch[i].chance); } solve(); } return 0; } </algorithm></cstring></cstdio>

你可能感兴趣的:(HDU1203 DP 01背包问题)