[Offer收割]程式設計練習賽2 hihocoder 1272 買零食 (DFS 或 dp 水題)

_TCgogogo_發表於2016-03-14
時間限制:5000ms
單點時限:1000ms
記憶體限制:256MB

描述

小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

題目連結:http://hihocoder.com/problemset/problem/1273

題目分析:資料很小,隨便搞,讀入的時候把小數轉整數,可避免精度問題

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;
int ans, n, cost[55], val[55];

void DFS(int pos, int num, int p, int cnt)
{
    
    if(num && num % 50 == 0 && cnt <= 3)
        if(p > ans)
            ans = p;
    if(cnt > 3 || pos == n)
        return;
    DFS(pos + 1, num, p, cnt);
    DFS(pos + 1, num + cost[pos], p + val[pos], cnt + 1);
}

int main()
{
    int T;
    scanf("%d", &T);
    while(T --)
    {
        ans = 0;
        int tmp1;
        scanf("%d", &n);
        double tmp;
        for(int i = 0; i < n; i++)
        {
            scanf("%lf", &tmp);
            cost[i] = (int) (tmp * 10.0);
            scanf("%d", &val[i]);
        }
        DFS(0, 0, 0, 0);
        printf("%d\n", ans);
    }
}


相關文章