hdu-1864最大清算額

1506 ワード

       ;   ,            
  :
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
double dp[60],money[60];
double total;
int num,i,j,n,k,t;
double max(double a,double b){
	return a>b?a:b;
}
int main(){
	int flag,temp;
	char ch;
	double A,B,C,m;
	while(~scanf("%lf %d",&total,&num),num){
		temp=0;
		memset(dp,0,sizeof(dp));
		memset(money,0,sizeof(money));
		for(i=1;i<=num;i++){
			A=0; B=0; C=0;
			flag=1;
			scanf("%d",&n);
			for(j=0;j<n;j++){
				scanf(" %c:%lf",&ch,&m);
			//	printf("%c:%.2lf
",ch,m); if(ch!='A'&&ch!='B'&&ch!='C'||m>600) { flag=0; break; } if(ch=='A') A+=m; else if(ch=='B') B+=m; else if(ch=='C') C+=m; } if(flag && A<=600 && B<=600 && C<=600 && A+B+C<=1000) money[temp++]=A+B+C; // printf("%.2lf ",A+B+C) // printf("%.2lf ",money[temp-1]); } for(i=0;i<=temp;i++){ for(j=temp;j>=1;j--){ if(j==1 || dp[j-1]>0 && dp[j-1]+money[i]<=total) dp[j]=max(dp[j],dp[j-1]+money[i]); } } int sum=0; for(i=1;i<=temp;i++) if(dp[sum]<dp[i]) sum=i; printf("%.2lf
",dp[sum]); } return 0; }

タイトルリンク:http://acm.hdu.edu.cn/showproblem.php?pid=1864