标签:
///先进行一遍dp过程,因为反正都要进行判断是否能够均分, ///dp过程不能在中间过程断开,要进行完才行 #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int max_1 = 100000 + 100; const int max_2 = 100; int val[max_2]; int num[max_2]; int dp[max_1]; int main() { int n, ans; while(~scanf("%d", &n)) { if(n <= 0) break; memset(dp, 0, sizeof(dp)); ans = 0; for(int i = 0; i < n; i++) { scanf("%d %d", val+i, num+i);///物品所占的体积与其的价值等值 ans += val[i] * num[i]; } for(int i = 0; i < n; i++) { int k = 1; while(k < num[i]) { for(int j = max_1; j - val[i]*k >= 0; j--) dp[j] = max(dp[j], dp[j - k*val[i]] + k*val[i]); num[i] -= k; k *= 2; } for(int j = max_1; j - val[i]*num[i] >= 0; j--) { dp[j] = max(dp[j], dp[j-val[i]*num[i]] + num[i]*val[i]); } } // printf("%d\n", dp[max_1]); int half = ans / 2; if(dp[half] < ans - dp[half]) { printf("%d %d\n", ans - dp[half], dp[half]); } else { printf("%d %d\n", dp[half],ans - dp[half]); } } return 0; }
参考:
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 5 using namespace std; 6 const int max_1 = 100000 + 10; 7 const int max_2 = 101; 8 int val[max_2]; 9 int num[max_2]; 10 int dp[max_1]; 11 12 int main() 13 { 14 int n; 15 int ans, half; 16 while(~scanf("%d", &n)) 17 { 18 if(n <= 0) 19 break; 20 21 ans = 0; 22 memset(dp, 0, sizeof(dp)); 23 for(int i = 0; i < n; i++) 24 { 25 scanf("%d %d", val+i, num+i); 26 ans += val[i] * num[i]; 27 } 28 29 half = ans / 2; 30 for(int i = 0; i < n; i++) 31 { 32 if(val[i] * num[i] >= half) 33 { 34 for(int j = val[i]; j <= half; j++) 35 { 36 dp[j] = max(dp[j], dp[j - val[i]] + val[i]); 37 } 38 //printf("%d\n", dp[half]); 39 } 40 else 41 { 42 int k = 1; 43 while(k < num[i]) 44 { 45 for(int j = half; j - k*val[i] >= 0; j--) 46 { 47 dp[j] = max(dp[j], dp[j - k*val[i]] + k*val[i]); 48 } 49 num[i] -= k; 50 k *= 2; 51 } 52 53 for(int j = half; j - num[i]*val[i] >= 0; j--) 54 { 55 dp[j] = max(dp[j], dp[j - num[i]*val[i]] + num[i]*val[i]); 56 } 57 } 58 59 } 60 61 if(dp[half] < ans - dp[half]) 62 { 63 printf("%d %d\n", ans - dp[half], dp[half]); 64 } 65 else 66 { 67 printf("%d %d\n", dp[half],ans - dp[half]); 68 } 69 } 70 return 0; 71 }
标签:
原文地址:http://www.cnblogs.com/ya-cpp/p/4344697.html