问题 : 正整数分组
来源:互联网 发布:mac口红有几个产地 编辑:程序博客网 时间:2024/05/22 13:06
题目描述
将一堆正整数分为2组,要求2组的和相差最小。
例如:1 2 3 4 5,将1 2 4分为1组,3 5分为1组,两组和相差1,是所有方案中相差最少的。
输入
第1行:一个数N,N为正整数的数量。
第2 - N+1行,N个正整数。
(N <= 100, 所有正整数的和 <= 10000)
输出
输出这个最小差
样例输入
5
1
2
3
4
5
样例输出
1
题解:其实只是一道典型的01背包型的DP题,要使得差值最小,及尽可能的接近数总和的一半,即拿物品(每种只有一个)去凑sum/2的背包体积。
都是由于我湖OJ测试数据比较水,可以用递归去做,下面附说递归代码和DP代码
递归AC代码:
#include <iostream>#include<algorithm>#include<cmath>using namespace std;int a[101],cha=999,n,sum;void fun(int c,int b){ sum+=c; // cout<<sum<<endl; int temp=sum; if(b==n){ if(abs(sum)<cha){ cha=abs(sum); } return; } ++b; fun(a[b],b); sum=temp; fun(-a[b],b); return; }int main(){ cin>>n; a[0]=0; for(int i=1;i<=n;i++){ cin>>a[i]; } sum=0; fun(-a[0],0); cout<<cha; return 0;}
DP AC代码
#include <iostream>#include<cstdio>#include<cstring>using namespace std;const int maxn=10005;int f[101][maxn],n;int main(){ memset(f,0,sizeof(f)); scanf("%d",&n); int p[n],sum=0; memset(p,0,sizeof(p)); for(int i=1;i<=n;i++){ scanf("%d",&p[i]); sum+=p[i]; } for(int i=1;i<=n;i++){ for(int v=1;v<=sum/2;v++){ if(v<p[i]) f[i][v]=f[i-1][v]; else f[i][v]=max(f[i-1][v],f[i-1][v-p[i]]+p[i]); } } /* for(int i=1;i<=n;i++){ for(int j=1;j<=W;j++){ cout<<f[i][j]<<" "; } cout<<endl; }*/ cout<<sum-2*f[n][sum/2]; return 0;}
阅读全文
1 0
- 问题 : 正整数分组
- 51Nod--正整数分组--01背包问题
- 正整数分组
- 正整数分组
- 正整数分组
- 正整数分组
- 正整数分组
- 正整数分组
- 正整数分组
- 正整数分组
- 正整数分组
- 51nod 1007 正整数分组 (类01背包问题)
- 51nod-正整数分组问题(基础方程DP-01背包)
- 51nod 1007 正整数分组 分组问题转换为背包问题
- 1007 正整数分组
- 动态规划:正整数分组
- 1007 正整数分组
- 51nod1007 正整数分组
- CMMB中的H264和AAC打包成ts流
- Spring security实现登录验证+权限控制
- 字符串操作与一级指针内存模型
- 树莓派3B命令行配置wifi,远程桌面连接,扩展存储
- 网站运行PHP出现No input file specified 的解决办法
- 问题 : 正整数分组
- java方法覆盖和方法重载
- Golang之测试用例
- squid 代理上网
- Http meta详解
- zoj 3211 Dream city dp+贪心
- 问题 : 点球大战
- 求图的割边(桥)(邻接矩阵 无向图)C~
- 关于list从属的关系