hihoweek 137(简单完全背包)

题目链接: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 }
原文地址:https://www.cnblogs.com/geloutingyu/p/6390177.html