I need A offer! POJ-1203
2400 ワード
I NEED A OFFER!
Time Limit: 2000/1000 MS (Java/Others)Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 11898Accepted Submission(s): 4566
Problem Description
Speaklessはとっくに外国へ行きたいと思っていたが、今では必要な試験をすべて終え、準備する材料をすべて用意していたので、学校を申請する必要がある.海外のどの大学を申請するにも、一定の申請費用を払わなければならないのは驚くべきことだ.Speaklessはあまりお金がなくて、全部でn万ドルしか貯金していません.彼はmの学校の中でいくつかのものを選びます(もちろん彼の経済的な許容範囲内です).各学校には異なる申請費用a(万ドル)があり、Speaklessは彼がこの学校offerを得る可能性bを推定した.異なる学校間でofferが得られるかどうかは互いに影響しない.「I NEED A OFFER」と彼は大声で叫んだ.このかわいそうな人を助けて、計算を手伝って、彼は少なくとも1部のofferの最大確率を受け取ることができます.(Speaklessが複数の学校を選択した場合、任意の学校のofferを得ることができます).
Input
いくつかのグループのデータが入力され、各グループのデータの最初の行には2つの正の整数n,m(0<=n<=100000,0<=m<=10000)がある.
後のm行は、各行に2つのデータai(整数型)があり、bi(実型)はそれぞれi番目の学校の申請費用とofferを受け取る可能性がある確率を示している.
入力の最後に0が2つあります.
Output
各データのセットは、Speaklessが少なくとも1つのofferを得る可能性がある最大確率を示す出力に対応する.パーセンテージで表し、小数点以下の1桁まで正確に表す.
Sample Input
Sample Output
Time Limit: 2000/1000 MS (Java/Others)Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 11898Accepted Submission(s): 4566
Problem Description
Speaklessはとっくに外国へ行きたいと思っていたが、今では必要な試験をすべて終え、準備する材料をすべて用意していたので、学校を申請する必要がある.海外のどの大学を申請するにも、一定の申請費用を払わなければならないのは驚くべきことだ.Speaklessはあまりお金がなくて、全部でn万ドルしか貯金していません.彼はmの学校の中でいくつかのものを選びます(もちろん彼の経済的な許容範囲内です).各学校には異なる申請費用a(万ドル)があり、Speaklessは彼がこの学校offerを得る可能性bを推定した.異なる学校間でofferが得られるかどうかは互いに影響しない.「I NEED A OFFER」と彼は大声で叫んだ.このかわいそうな人を助けて、計算を手伝って、彼は少なくとも1部のofferの最大確率を受け取ることができます.(Speaklessが複数の学校を選択した場合、任意の学校のofferを得ることができます).
Input
いくつかのグループのデータが入力され、各グループのデータの最初の行には2つの正の整数n,m(0<=n<=100000,0<=m<=10000)がある.
後のm行は、各行に2つのデータai(整数型)があり、bi(実型)はそれぞれi番目の学校の申請費用とofferを受け取る可能性がある確率を示している.
入力の最後に0が2つあります.
Output
各データのセットは、Speaklessが少なくとも1つのofferを得る可能性がある最大確率を示す出力に対応する.パーセンテージで表し、小数点以下の1桁まで正確に表す.
Sample Input
10 3
4 0.1
4 0.2
5 0.3
0 0
Sample Output
44.0%
Hint
You should use printf("%%") to print a '%'.
#include <stdio.h>
int m, n;
int cost[10001];
double e[10001], opt[10001], tmp;
int main() {
while (scanf("%d %d", &n, &m)) {
if (m == 0 && n == 0)
break;
for (int i = 0; i < m; i++) {
scanf("%d %lf", &cost[i], &e[i]);
e[i] = 1.0 - e[i];
}
for (int i = 0; i <= n; i++)
opt[i] = 1.0;
for (int i = 0; i < m; i++) {
for (int j = n; j >= cost[i]; j--) {
tmp = opt[j - cost[i]] * e[i];
if (opt[j] > tmp)
opt[j] = tmp;
}
/*
for (int i = 0; i <= n; i++)
printf("%.2f ", opt[i]);
puts("
");*/
}
printf("%.1f%%
", (1 - opt[n]) * 100);
}
return 0;
}