标签:
Description
Input
Output
Sample Input
Sample Output
#include<stdio.h>
#include<string.h>
double max(double a,double b)
{
return a>b?a:b;
}
int flag[40];
double mon[40],dp[3000010];
int main()
{
double q,sum,money,suma,sumb,sumc;
char kind;
int n,m;
int i,j;
while(1)
{
memset(mon,0,sizeof(mon));
for(i=0; i<40; i++)
flag[i]=1;
memset(dp,0,sizeof(dp));
scanf("%lf%d",&q,&n);
getchar();
if(n==0)
break;
for(i=1; i<=n; i++) //输入易错,有%c注意回车
{
scanf("%d",&m);
getchar();
for(j=0,sum=0,suma=0,sumb=0,sumc=0; j<m; j++)
{
scanf("%c:%lf",&kind,&money);
getchar();
if(kind<65||kind>67)
{
flag[i]=0;
continue;
}
if(kind==‘A‘)
suma+=money; //同类物品可能多次出现,需要判断它们的和是否大于600
else if(kind==‘B‘)
sumb+=money;
else if(kind==‘C‘)
sumc+=money;
sum+=money;
}
if(suma>600||sumb>600||sumc>600)
flag[i]=0;
if(sum>1000)
flag[i]=0;
if(flag[i])
mon[i]+=sum;
}
for(i=1; i<=n; i++)
{
for(j=(int)(q*100); j>=(int)(mon[i]*100)&&flag[i]; j--)
dp[j]=max(dp[j],dp[j-(int)(mon[i]*100)]+mon[i]); //状态转移,注意理解dp下标,dp下标应为限制条件。注意分析理解dp数组中的元素及其更新情况。
} //限制条件只有钱数,数据为两位小数的double型,故*100
for(i=(int)(q*100); i>=0; i--)
{
if(dp[i]<=q)
{
printf("%.2lf\n",dp[i]);
break;
}
}
}
return 0;
}
标签:
原文地址:http://www.cnblogs.com/jasonlixuetao/p/4438688.html