[Offer收割]程式設計練習賽1 hihocoder 1270 建造基地 (完全揹包)
阿新 • • 發佈:2019-02-01
時間限制: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
題目分析:比較裸的完全揹包,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); } }