1. 程式人生 > >UVA-562 Dividing coins---01背包+平分錢幣

UVA-562 Dividing coins---01背包+平分錢幣

std .net i++ lan pac bsp urn ble 要求

題目鏈接:

https://vjudge.net/problem/UVA-562

題目大意:

給定n個硬幣,要求將這些硬幣平分以使兩個人獲得的錢盡量多,求兩個人分到的錢最小差值

思路:

它所給出的n個錢幣加起來sum,將sum/2當作體積,求出在sum/2下的最大值,sum-2*dp[sum/2]

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn = 105;
 4 const int maxm = 1e5+10;
 5 int a[maxn];
 6 int dp[maxm];
 7 int T, n, m;
8 int main() 9 { 10 cin >> T; 11 while(T--) 12 { 13 cin >> n; 14 int sum = 0; 15 memset(dp, 0, sizeof(dp)); 16 for(int i = 0; i < n; i++)cin >> a[i], sum += a[i]; 17 for(int i = 0; i < n; i++) 18 { 19 for(int
j = sum / 2; j >= a[i]; j--) 20 dp[j] = max(dp[j], dp[j - a[i]] + a[i]); 21 } 22 cout<<(sum - 2 * dp[sum / 2])<<endl; 23 } 24 return 0; 25 }

UVA-562 Dividing coins---01背包+平分錢幣