[Offer收割]程式設計練習賽1 hihocoder 1270 建造基地 (完全揹包)

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

描述

在遙遠的未來,小Hi成為了地球聯邦外空間聯合開發工作組的一員,前往一顆新發現的星球開發當地的重金屬資源。

為了能夠在當地生存下來,小Hi首先要建立一個基地。建立基地的材料可以直接使用當地的石材和富裕的重金屬資源。基地建設分為N級,每一級都需要達成K的建設值後才能夠完成建設,當前級別的建設值溢位後不會影響到下一級的建設。

小Hi可以產出的重金屬資源按照精煉程度分為M級,根據開採的數量和精煉的工藝,可以將獲取精煉程度為第i級的重金屬資源的成本量化為Ai

在建設第1級基地時,一塊精煉度為i的重金屬可以提供Bi的建設值,此後基地的級別每提高一級,建設值將除以T並下取整(整除)。

現給定N、M、K、T、A[]和B[],小Hi需要你幫助他計算他完成基地建設的最小成本。

輸入

輸入包含多組測試資料。

輸入的第一行為一個整數Q,表示測試資料的組數。

每組測試資料的第一行為4個整數N、M、K和T,意義如前文所述。

接下來的一行為M個整數,分別表示A1~AM

接下來的一行為M個整數,分別表示B1~BM

對於100%的資料,滿足1<=N<=10,1<=M<=100,1<=K,T<=104

對於100%的資料,滿足Ai和Bi均為32位整型範圍內的正整數

對於100%的資料,滿足1<=Q<=10

輸出

對於每組測試資料,如果小Hi最終能夠完成基地建設,則輸出小Hi完成基地建設所需要的最小成本,否則輸出“No Answer”。

樣例輸入
2
2 2 2 2
1 3
1 2
2 2 2 2
1 2
1 1
樣例輸出
8
No Answer


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


題目分析:比較裸的完全揹包,dp[i]表示建設值為i時的最小成本

#include <cstdio>
#include <algorithm>
#define ll long long
using namespace std;
int const INF = (1 << 30);
int const MAX = 1e4 + 5;
int n, m, k, t;
int a[105], b[105];
ll dp[MAX];

int main()
{
    int T;
    scanf("%d", &T);
    while(T --)
    {
        scanf("%d %d %d %d", &n, &m, &k, &t);
        for(int i = 1; i <= m; i++)
            scanf("%d", &a[i]);
        for(int i = 1; i <= m; i++)
            scanf("%d", &b[i]);
        ll ans = 0;
        bool flag = true;
        for(int i = 0; i < n; i++)
        {
            for(int j = 0; j < MAX; j++)
                dp[j] = INF;
            dp[0] = 0;
            ll cur = INF;
            for(int j = 1; j <= m; j++)
            {
                for(int l = 0; l <= k; l++)
                {
                    if(b[j] + l > k)
                        cur = min(cur, dp[l] + a[j]);
                    else
                        dp[b[j] + l] = min(dp[b[j] + l], dp[l] + a[j]);
                }
            }
            cur = min(cur, dp[k]);
            if(cur == INF)
            {
                flag = false;
                printf("No Answer\n");
                break;
            }
            ans += cur;
            for(int j = 1; j <= m; j++)
                b[j] /= t;
        }
        if(flag)
            printf("%lld\n", ans);
    }
}

相關文章