一.题目描述:
二.解题思路:
刚开始一直有个错觉,以为左右脑做个贪心就可以了,一交全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 }