HDU 1864 - 최대 청구 액 01 가방

http://acm.hdu.edu.cn/showproblem.php?pid=1864
주의 점: 1. 소수 * 100 (모두 두 소수 만 있 음);2. 배열 크기 가 틀 리 지 않도록 합 니 다.3. 단일 물품 은 A 항, B 항, C 항 을 말 하기 때문에 영수증 한 장 에 있 는 모든 A 금액 이 600 을 초과 해 서 는 안 됩 니 다.4. 입력 에 주의 하기;
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxv = 3000000+10;
int dp[maxv];
float q;
int n;
int a[35];

int main()
{
	while(~scanf("%f%d", &q, &n))
	{
		if(n == 0)	break;
		int cnt = 0;
		memset(a, 0, sizeof a);
		memset(dp, 0, sizeof dp);
		for(int i = 1;i<=n;i++)
		{
			bool flag = true;
			int x;
			scanf("%d", &x);
			double suma = 0, sumb = 0, sumc = 0;
			while(x--)
			{
				getchar();
				char c;
				float k;
				scanf("%c:%f", &c, &k);
				if(c == 'A')	suma += k;
				else if(c == 'B')	sumb += k;
				else if(c == 'C')	sumc += k;
				else	flag = false;
				
			}
			if(flag && suma <= 600 && sumb <=600 && sumc <= 600)
				a[cnt++] = (suma+sumb+sumc)*100*1.0;
		}
		int sum = q*100*1.0;
		for(int i = 0;i<cnt;i++)
		{
			for(int j = sum;j>=a[i];j--)
			dp[j] = max(dp[j], dp[j-a[i]]+a[i]);
		}
		printf("%.2f
", (float)dp[sum]/100); } return 0; }

좋은 웹페이지 즐겨찾기