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

  
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; }