[Jobdu] 题目1420:Jobdu MM分水果
2012-08-16 16:08
169 查看
题目描述:
Jobdu团队有俩PPMM,这俩MM干啥都想一样。一天,富强公司给团队赞助了一批水果,胡老板就把水果派发给了这俩MM,由她们自行分配。每个水果都有一个重量,你能告诉她们怎么分才使得分得的重量差值最小吗?
输入:
输入有多组数据,每组数据第一行输入水果个数n(1<=n<=100),接下来一行输入n个重量wi(0<=wi<=10^5)。
输出:
对每组输入输出一行,输出可以得到的最小差值。
样例输入:
样例输出:
典型的动态规划题目,类似于背包问题,有一点注意只要判断sum/2即可,min=0时可直接退出,尽量避免做无用功。
Jobdu团队有俩PPMM,这俩MM干啥都想一样。一天,富强公司给团队赞助了一批水果,胡老板就把水果派发给了这俩MM,由她们自行分配。每个水果都有一个重量,你能告诉她们怎么分才使得分得的重量差值最小吗?
输入:
输入有多组数据,每组数据第一行输入水果个数n(1<=n<=100),接下来一行输入n个重量wi(0<=wi<=10^5)。
输出:
对每组输入输出一行,输出可以得到的最小差值。
样例输入:
5 10 20 30 10 10
样例输出:
0 用dp求解,代码如下:
#include <iostream> #include <cstdio> #include <vector> using namespace std; int n,s; vector<int> v; vector<bool> d; int main(int argc,char* argv[]){ //freopen("input.txt","r",stdin); while(cin>>n){ v.resize(n); s = 0; for(int i=0;i<n;i++){ cin>>v[i]; s += v[i]; } int min = s; int tmp,p=s/2+1; d.resize(p); for(int i=0;i<p;i++){ d[i] = false; } d[0] = true; for(int i=0;i<n;i++){ for(int j=p;j>=v[i];j--){ if(d[j-v[i]] == true){ d[j] = true; tmp = s-2*j; if(tmp<0){ tmp = 0-tmp; } min = tmp<min?tmp:min; if(min==0){ break; } } } } cout<<min<<endl; } return 0; }
典型的动态规划题目,类似于背包问题,有一点注意只要判断sum/2即可,min=0时可直接退出,尽量避免做无用功。
相关文章推荐
- 题目1420:Jobdu MM分水果
- 九度OJ题目1420:Jobdu MM分水果
- 九度 1420 Jobdu MM分水果
- 九度oj 1420:Jobdu MM分水果
- 九度笔记之 1420:Jobdu MM分水果
- JD 1358:陈博的平均主义 && JD 1420:Jobdu MM分水果(01背包)
- 九度 1420 Jobdu MM分水果 -- 动态规划、深度优先搜索
- 九度 1420 Jobdu MM分水果 -- 动态规划、深度优先搜索
- 题目1107:搬水果 九度OJ
- [Jobdu] 题目1531:货币面值
- [Jobdu] 题目1367:二叉搜索树的后序遍历序列
- Jobdu 题目1024:畅通工程
- [Jobdu] 题目1139:最大子矩阵
- jobdu 题目1099:后缀子串排序
- 题目1510:替换空格 jobdu
- Jobdu 题目1168:字符串的查找删除
- Jobdu 题目1078:二叉树遍历
- Jobdu 题目1201:二叉排序树
- [Jobdu] 题目1506:求1+2+3+...+n
- Jobdu 题目1162:I Wanna Go Home