CSU 1945: 最简单的题目

举报
用户已注销 发表于 2021/11/19 03:29:26 2021/11/19
【摘要】 题目: Description 小明有一台笔记本电脑,一台台式机电脑,两台电脑的性能相同,现在小明手里有N个等待运行的程序,每个程序运行所需的时间分别为n1,n2,n3,n4……,一台电脑同一时刻只能运行一个程序,一个程序只需要运行一次。两台电脑同时开始运行,请问小明该如何分配程序在这两台电脑上运行,使得最后结束运行的电脑的运行...

题目:

Description

小明有一台笔记本电脑,一台台式机电脑,两台电脑的性能相同,现在小明手里有N个等待运行的程序,每个程序运行所需的时间分别为n1,n2,n3,n4……,一台电脑同一时刻只能运行一个程序,一个程序只需要运行一次。两台电脑同时开始运行,请问小明该如何分配程序在这两台电脑上运行,使得最后结束运行的电脑的运行时间最短。

Input

输入不超过30组数据,每组数据第一行为N,代表有N个等待运行的程序,第二行为N个数字,代表每个程序的运行时间,1 <= N <= 1000 ,每个程序的运行时间均为正整数, 所有程序的运行时间之和不超过5000。

Output

输出最后结束运行的电脑的运行时间。

Sample Input

2
1 1
2
1 2
3
1 2 3

Sample Output

1
2
3


思路:

首先是贪心,选出一些数,使得选出的数的总数最接近所有数的总数的一半即可。

其次是动态规划,其实就是0-1背包

代码:


  
  1. #include<iostream>
  2. #include<string.h>
  3. #include<algorithm>
  4. using namespace std;
  5. int value[1001], ans[5001];
  6. int main()
  7. {
  8. int N, V;
  9. while (cin >> N)
  10. {
  11. V = 0;
  12. memset(ans, 0, sizeof(ans));
  13. for (int i = 1; i <= N; i++)
  14. {
  15. cin >> value[i];
  16. V+= value[i];
  17. }
  18. for (int i = 1; i <= N; i++)for (int j = V/2; j >= value[i]; j--)
  19. ans[j] = max(ans[j], ans[j - value[i]] + value[i]);
  20. cout << V - ans[V / 2] << endl;
  21. }
  22. return 0;
  23. }

文章来源: blog.csdn.net,作者:csuzhucong,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/nameofcsdn/article/details/79894585

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。