/*
转化为01背包问题,背包体积为10,每个石头的价值为自身的重量,
1. F[i,v]表示背包恰好为v下,前i件物品的最大价值
2. F[i,v]=max{F[i-1,v],F[i-1,v-1]+Ci}
3. 注意非装满问题 F[0,0..N]=0 F[0..N,0]=0
4. 扫描数组,找到F[N,v]中最接近sum{Ci}/2的那个
*/
#include<iostream>
#include<vector>
using namespace std;
vector<int> stone_divide(vector<int> & nums){
vector<int> F(nums.size()+1,0);
for(int i=1;i<nums.size()+1;++i)
for(int v=nums.size()+1;v>0;--v)
F[v]=max(F[v],F[v-1]+nums[i-1]);
int k=0,sum=0,tmp=9999;
for(int i=0;i<nums.size();++i)
sum+=nums[i];
for(int i=0;i<F.size();++i){
if(tmp>abs(F[i]-sum/2)){
tmp=abs(F[i]-sum/2);
k=i;
}
}
if(F[k]>sum/2)
return {F[k],sum-F[k]};
return {sum-F[k],F[k]};
}
int main(void){
vector<int> nums;
int tmp;
char comma;
while(cin>>tmp){
nums.push_back(tmp);
cin>>comma;
}
nums=stone_divide(nums);
cout<<nums[0]<<","<<nums[1]<<endl;
}
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
int main(int argc, char** argv){
vector<int> vec;
int num;
while(true){
scanf("%d",&num);
vec.push_back(num);
int r = scanf(",");
if (r == EOF){
break;
}
}
int sum = 0, a = 0, b = 0;
int i = 0, j = vec.size() - 1;
while(i < j && i < vec.size() && j > 0){
if (a <= b){
a += vec[i];
i++;
}else{
b += vec[j];
j--;
}
}
if(a >= b){
cout<<a<<","<<b<<endl;
}else{
cout<<b<<","<<a<<endl;
}
}
int main()
{ vector<int>temp; string str = ""; cin >> str; for (auto i : str) { if (isdigit(i)) temp.push_back(i - '0'); }
sort(temp.begin(), temp.end());
vector<int>::iterator begin = temp.begin();
vector<int>::iterator end = temp.end();
vector<int>::iterator mid= temp.begin();
int min = 100000;
int half = 0, otherhalf = 0;
while(mid!=end)
{
int init = 0;
int init1 = 0;
int x = accumulate(begin, mid+1,init); int y= accumulate(mid+1, end, init1);
if (abs(x - y) < min)
{
min = abs(x - y);
half = x;
otherhalf = y;
}
++mid;
}
if (half > otherhalf)
cout << half << "," << otherhalf;
else
cout << otherhalf << "," << half;
return 0;
}
假设数组为nums, sum为元素之和。
从i = sum/2开始,用动态规划判断nums中是否有一组数的值和为i。
如果有,则输出sum - i,i。没有,则--i继续查找。
动态规划部分,可以参考Leetcode 416. Partition Equal Subset Sum。
感觉不是最优的解法,哪位大佬讲解一下?