題目1 : 買零食 傳送門
描述
小Ho很喜歡在課間去小賣部買零食。然而不幸的是,這個學期他又有在一教的課,而一教的小賣部姐姐以冷若冰霜著稱。第一次去一教小賣部買零食的時候,小Ho由於不懂事買了好一大堆東西,被小賣部姐姐給了一個“冷若冰霜”的眼神,食慾都下降了很多。
從那以後,小Ho就學乖了,去小賣部買東西只敢同時買3包以內的零食,並且價格加起來必須是5的整數倍,方便小賣部姐姐算價格。
但是小Ho不擅長計算,所以他把小賣部裏所有零食的價格以及他對這個零食的渴望度都告訴了你,希望你能夠幫他計算出在不惹惱小賣部姐姐的前提下,能夠買到零食的渴望度之和最高是多少?
輸入
每個輸入文件包含多組測試數據,在每個輸入文件的第一行爲一個整數Q,表示測試數據的組數。
每組測試數據的第一行爲一個正整數N,表示小賣部中零食的數量。
接下來的N行,每行爲一個正實數A和一個正整數B,表示這種零食的價格和小Ho對其的渴望度。
一種零食僅有一包。
對於100%的數據,滿足1 <= Q <= 10,1<=N<=50,0<A<=10,1<=B<=100。
對於100%的數據,滿足A的小數部分僅可能爲0.5或0。
輸出
對於每組測試數據,輸出一個整數Ans,表示小Ho可以獲得最大的渴望度之和。
1 4 0.5 6 4.5 7 5.0 4 2.0 9樣例輸出
17
代碼:
//
// Created by liyuanshuo on 2017/3/15.
//
#include <iostream>
#include <cstdio>
using namespace std;
int N;
int b[55];
float a[55];
int sum, maxx = -1;
void solve(float s, int n, int seq, int l)
{
if( n > 3 )
return;
if ( s ==(int)(s))
if( int(s) % 5 == 0 )
{
if ( l > maxx )
maxx = l;
}
for (int i = seq; i < N ; ++i)
{
solve (a[i]+s, n+1, i+1, l+b[i]);
}
}
int main( )
{
//freopen ("F:\\CSLeaning\\Thinking in C++\\hihocoder\\in.in", "r", stdin);
int t;
cin>>t;
while ( t-- )
{
cin>>N;
maxx = -1;
for (int i = 0; i < N; ++i)
{
cin>>a[i]>>b[i];
}
solve (0 ,0, 0, 0);
cout<<maxx<<endl;
}
return 0;
}