/* 转化为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。
感觉不是最优的解法,哪位大佬讲解一下?