问题 M: 【动态规划】数字分组I
时间限制: 1 Sec 内存限制: 64 MB提交: 106 解决: 59
[提交] [状态] [讨论版] [命题人:]
题目描述
给出一堆魔法石的重量,问如何分成两堆,使得它们质量和之差最小,求出这个最小值。
输入
第一行一个数n (n ≤30)。 接下来n行,每行一个正整数。(每个数≤100000)
输出
一个整数表示两组数字和的最小差。
样例输入
5
1 2 3 4 5
样例输出
1
分析:设置背包总量为总和一班。。之前有类似的题,这个比较水。
#include <iostream> #include <string> #include <cstdio> #include <cmath> #include <cstring> #include <algorithm> #include <vector> #include <queue> #include <deque> #include <map> #define range(i,a,b) for(int i=a;i<=b;++i) #define LL long long #define rerange(i,a,b) for(int i=a;i>=b;--i) #define fill(arr,tmp) memset(arr,tmp,sizeof(arr)) using namespace std; int n,a[35],dp[1500005],sum; void init(){ cin>>n; fill(dp,0); range(i,0,n-1){ cin>>a[i]; sum+=a[i]; } } void solve(){ range(i,0,n-1) rerange(j,sum>>1,a[i])dp[j]=max(dp[j],dp[j-a[i]]+a[i]); cout<<sum-(dp[sum>>1]<<1)<<endl; } int main() { init(); solve(); return 0; }