Product Development

Cz_502 / 2024-04-25 / 原文

 Product Development

题目大意

一个项目需要k个物品都至少到达p个数量; 现在有n个套餐, 每个套餐都可以给这k个物品加若干个数量, 每个套餐都要各自的价格; 请问在满足项目要求的情况下需要的最小花费是多少;

题解思路

在一定限制内,求其成本最小化,与01背包中,在一定范围内,价值最大化,有异曲同工之处,所以这里使用01背包的思想,需要注意的是,这里说的是至少参数为k,所以可以大于等于k,那么在取其值的时候,如果当前的最小取值不再是该计划的参数增加值,而是0,这样的话,当最终为k的时候,其真实情况中,该物品的参数可以是大于等于k的

 1 #include <iostream>
 2 #include<math.h>
 3 #include<string.h>
 4 #define int long long
 5 using namespace std;
 6 const int N = 109;
 7 int n, m, k;
 8 int c[N], s[N][N];
 9 int dp[9][9][9][9][9];
10 void solve() {
11     cin >> n >> m >> k;
12     for (int i = 1; i <= n; i++) {
13         cin >> c[i];
14         for (int j = 0; j < m; j++) {
15             cin >> s[i][j];
16         }
17     }
18 
19     //初始化,初始化的值一定要大
20     for (int h1 = 0; h1 <= k; h1++) {
21         for (int h2 = 0; h2 <= k; h2++) {
22             for (int h3 = 0; h3 <= k; h3++) {
23                 for (int h4 = 0; h4 <= k; h4++) {
24                     for (int h5 = 0; h5 <= k; h5++) {
25                         dp[h1][h2][h3][h4][h5] = 1e12 + 10;
26                     }
27                 }
28             }
29         }
30     }
31 
32     
33     //01背包思想
34     dp[0][0][0][0][0]=0;
35     for (int i = 1; i <= n; i++) {
36         for (int h1 = k; h1 >= 0; h1--) {
37             for (int h2 = k; h2 >= 0; h2--) {
38                 for (int h3 = k; h3 >= 0; h3--) {
39                     for (int h4 = k; h4 >= 0; h4--) {
40                         for (int h5 = k; h5 >= 0; h5--) {
41                             int s1=max(h1-s[i][0],0ll);
42                             int s2=max(h2-s[i][1],0ll);
43                             int s3=max(h3-s[i][2],0ll);
44                             int s4=max(h4-s[i][3],0ll);
45                             int s5=max(h5-s[i][4],0ll);
46                             int &t=dp[s1][s2][s3][s4][s5];
47                             int &tt=dp[h1][h2][h3][h4][h5];
48                             tt=min(tt,t+c[i]);
49                         }
50                     }
51                 }
52             }
53         }
54     }
55     
56     //如果小于m表示当前样例中没有该物品
57     int d[6];
58     for(int i=0;i<5;i++)
59     {
60         if(i<m) d[i]=k;
61         else d[i]=0;
62     }
63     
64     //可能会出现所有计划都不能使每个物品都为k的情况 
65     int dd=dp[d[0]][d[1]][d[2]][d[3]][d[4]];
66     if(dd>=1e12) cout<<"-1\n";
67     else cout<<dd<<"\n";
68 }
69 signed main() {
70     ios::sync_with_stdio(0);
71     cin.tie(0);
72     cout.tie(0);
73     solve();
74     return 0;
75 }