P2392kkksc03考前临时抱佛脚

一.题目描述:

P2392kkksc03考前临时抱佛脚

 

 P2392kkksc03考前临时抱佛脚

 

 二.解题思路:

刚开始一直有个错觉,以为左右脑做个贪心就可以了,一交全wa,????,不信,再交一边,又全wa,然后我突然想到了以前学dp的时候,做过一个类似于求解数组分成两部分求和最小题目,这个应该就是那个题目的变形,然后我就开始上模板了,一顿cv,交上去莫名ac。

三.代码实现:

 1 #include "bits/stdc++.h"
 2 using namespace std;
 3 int a[100],b[100],c[100],d[100];
 4 int dpa[11000];
 5 int main()
 6 {
 7     int s1,s2,s3,s4;
 8     int res1,res2,res3,res4;
 9     res1 = res2 = res3 = res4 = 0;//类似于求解数组分成两部分求和最小变形
10     cin >> s1 >> s2 >> s3 >> s4;
11     for(int i = 1;i <= s1;i++){
12         cin >> a[i];
13         res1 += a[i];
14     }
15     for(int i = 1;i <= s2;i++){
16         cin >> b[i];
17         res2 += b[i];
18     }
19     for(int i = 1;i <= s3;i++){
20         cin >> c[i];
21         res3 += c[i];
22     }
23     for(int i = 1;i <= s4;i++){
24         cin >> d[i];
25         res4 += d[i];
26     }
27     int sum = 0;
28     for(int i = 1;i <= s1;i++)
29         for(int j = res1 / 2;j >= a[i];j--)
30             dpa[j] = max(dpa[j],dpa[j - a[i]] + a[i]);
31     
32     sum += res1 - dpa[res1/2];
33     memset(dpa,0,sizeof(dpa));
34     for(int i = 1;i <= s2;i++)
35         for(int j = res2 / 2;j >= b[i];j--){
36             dpa[j] = max(dpa[j],dpa[j - b[i]] + b[i]);
37         }
38     
39 
40     sum += res2 - dpa[res2/2];
41     memset(dpa,0,sizeof(dpa));
42     
43     for(int i = 1;i <= s3;i++)
44         for(int j = res3 / 2;j >= c[i];j--)
45             dpa[j] = max(dpa[j],dpa[j - c[i]] + c[i]);
46     
47     sum += res3 - dpa[res3/2];
48     memset(dpa,0,sizeof(dpa));
49 
50     
51     for(int i = 1;i <= s4;i++)
52         for(int j = res4 / 2;j >= d[i];j--)
53             dpa[j] = max(dpa[j],dpa[j - d[i]] + d[i]);
54     
55     sum += res4 - dpa[res4/2];
56     memset(dpa,0,sizeof(dpa));
57 
58     cout << sum << endl;
59     return 0;
60 }

 

上一篇:【网易算法提前批】平分物品


下一篇:海洋霸权和Libra