这题就是一个简单的01背包,不过是用min来算的
思路 用每个大学的学费当weight ,概率当value(和robberies差不多),可能被好几个符合条件的学校录取,不被录取的相乘,就是而且取最小的,就可以得到被录取的最大概率
Ac 代码
using namespace std;
struct Dat
{
int a; float b;//wight,value(即价值)
}date[10000];
float dp[10000];
int main()
{
int n, m;//n为容量,m为几种
while (cin >> n >> m) {
if (n == 0 && m == 0) {
break;
}
for (int i = 0; i < m; i++) {
float k;
cin >> date[i].a >> k;//翻着做
date[i].b = 1 - k;
}
for (int i = 0; i<=n; i++) {
dp[i] = 1;
}
for (int i = 0; i < m; i++) {
for (int j = n; j>=date[i].a; j--) {
dp[j] = min(dp[j], dp[j - date[i].a] * date[i].b);
}
}
printf("%.1f%%\n", (1-dp[n])*100);
}
return 0;
}
具体的max还是min是根据题意的
I NEED A OFFER! HDU - 1203 (dp01背包 min计算)
原文:https://www.cnblogs.com/pursuit-purity/p/14337496.html