描述
去小卖部买东西只敢同时买3包以内的零食,并且价格加起来必须是5的整数倍,
输入
每个输入文件包含多组测试数据,在每个输入文件的第一行为一个整数Q,表示测试数据的组数。
每组测试数据的第一行为一个正整数N,表示小卖部中零食的数量。
接下来的N行,每行为一个正实数A和一个正整数B,表示这种零食的价格和小Ho对其的渴望度。
一种零食仅有一包。
满足1 <= Q <= 10,1<=N<=50,0<A<=10,1<=B<=100。
满足A的小数部分仅可能为0.5或0。
输出
对于每组测试数据,输出一个整数A,可以获得最大的渴望度之和。
-
样例输入
-
1 4 0.5 6 4.5 7 5.0 4 2.0 9
样例输出
-
17
其实这个题不是多难,就是看起来有些麻烦,仔细想想,就是直接暴力枚举就行了,数据不大。
应该注意的是,要求是三包以内,也就是说,可以是0,1,2,3.
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n,t,i,j,k;
double a[51],b[51],m;
scanf("%d",&n);
while(n--)
{
scanf("%d",&t);
for(i = 0;i<t;i++)
{
scanf("%lf %lf",&a[i],&b[i]);
}
m = 0; //不要忘了给m归0
for(i=0;i<t;i++)
{
if(b[i]>m&&(int)a[i]/5*5==a[i]) //因为 % 只能对整数运算,所以判断是否是5的倍数,用这个办法。
m = b[i]; //这是只买一种商品的情况
for(j=i+1;j<t;j++)
{
if(b[i]+b[j]>m&&(int)(a[i]+a[j])/5*5==(a[i]+a[j])) //买两种商品的情况
m=b[i]+b[j];
for(k=j+1;k<t;k++)
{
if(b[i]+b[j]+b[k]>m&&(int)(a[i]+a[j]+a[k])/5*5==(a[i]+a[j]+a[k])) //买三种商品的情况
m=b[i]+b[j]+b[k];
}
}
}
printf("%.0lf\n",m);
}
return 0;
}