题目链接:http://hihocoder.com/contest/hiho137/problem/1
题意:中文题诶~
思路:各层的成本计算不会有影响,所以我们只要把没一层的成本计算出来在求和就是答案啦。
至于如何计算单独一层的成本我们可以考虑用完全背包处理:
用dp[i]表示得到 i 的建设值最少需要花费多少成本,那么我们只需要逐步更新dp[i]即可。
代码:
1 #include <bits/stdc++.h>
2 #define MAXN 110
3 using namespace std;
4
5 struct node{
6 int a, b;
7 double value;
8 }gg[MAXN];
9 int dp[MAXN*MAXN];
10
11 int main(void){
12 int q, n, m, k, t, ans;
13 cin >> q;
14 while(q--){
15 bool ok=false;
16 ans=0;
17 cin >> n >> m >> k >> t;
18 for(int i=0; i<m; i++){
19 cin >> gg[i].a;
20 }
21 for(int i=0; i<m; i++){
22 cin >> gg[i].b;
23 }
24 for(int i=1; i<=n; i++){
25 memset(dp, 0x3f, sizeof(dp));
26 dp[0]=0;
27 bool flag=true;
28 for(int j=0; j<m; j++){
29 gg[j].value=gg[j].b*1.0/gg[j].a;
30 if(gg[j].value>0){
31 flag=false;
32 }
33 }
34 if(flag){
35 cout << "No Answer" << endl;
36 ok=true;
37 break;
38 }
39 for(int j=1; j<=k; j++){
40 for(int l=0; l<m; l++){
41 if(j>gg[l].b){
42 dp[j]=min(dp[j], dp[j-gg[l].b]+gg[l].a);
43 }else{
44 dp[j]=min(dp[j], gg[l].a);
45 }
46 }
47 }
48 ans+=dp[k];
49 for(int j=0; j<m; j++){
50 gg[j].b/=t;
51 }
52 }
53 if(!ok){
54 cout << ans << endl;
55 }
56 }
57 return 0;
58 }