CSUOJ 1945 最简单的题目 背包问题
来源:互联网 发布:云南bim知乎 编辑:程序博客网 时间:2024/05/16 11:00
Description
小明有一台笔记本电脑,一台台式机电脑,两台电脑的性能相同,现在小明手里有N个等待运行的程序,每个程序运行所需的时间分别为n1,n2,n3,n4……,一台电脑同一时刻只能运行一个程序,一个程序只需要运行一次。两台电脑同时开始运行,请问小明该如何分配程序在这两台电脑上运行,使得最后结束运行的电脑的运行时间最短。
Input
输入不超过30组数据,每组数据第一行为N,代表有N个等待运行的程序,第二行为N个数字,代表每个程序的运行时间,1 <= N <= 1000 ,每个程序的运行时间均为正整数, 所有程序的运行时间之和不超过5000。
Output
输出最后结束运行的电脑的运行时间。
Sample Input
21 121 231 2 3
Sample Output
123
好吧,这是个背包问题。
OTZ,比赛的时候拿贪心做的,跪了。后来看数据的话,发现贪心实际上也差得不是很多,果然贪心是一个比较好的近似算法呀。
背包的思想就是如何选择一些物品使得最接近平均值,因为两台机器都是平均值肯定是最好的。
想通了之后,代码并不是很长,还是比较好写的。
#include <iostream>#include <cstring>#include <algorithm>using namespace std;const int maxm=5010;bool dp[maxm];int n,mid,arr[1010],sum,ans;int main(){ ios_base::sync_with_stdio(0); while(cin>>n){ if(n==1){ cin>>ans; cout<<ans<<endl; continue; } for(int i=0;i<n;++i) cin>>arr[i],sum+=arr[i]; mid=(sum>>1); memset(dp,0,sizeof dp); dp[0]=true; for(int i=0;i<n;++i) if(arr[i]<=mid) for(int j=mid;j>=arr[i];--j) if(dp[j-arr[i]]) dp[j]=true; for(int i=mid;i;--i) if(dp[i]) ans=i,i=1; cout<<sum-ans<<endl; sum=0; } return 0;}
阅读全文
0 0
- CSUOJ 1945 最简单的题目 背包问题
- 最简单的背包问题
- 0-1背包(最简单也是最难的背包问题)
- CSU-1945 最简单的题目
- G(1945): 最简单的题目
- HDU 2602——最简单的背包问题
- 最简单的完全背包
- 简单的背包问题
- 简单的背包问题
- 简单的背包问题
- 简单的背包问题
- 简单的背包问题
- 简单的背包问题
- 简单的背包问题
- 最简单的C++题目
- 题目:最简单的逆向
- 最通俗易懂的背包问题
- 基础背包问题的一些题目!!
- 【JavaScript】正则表达式验证邮箱的注意事项
- 你的经验到底值多少钱
- 子数组和问题,和被某个数整除
- 来玩欢乐斗地主!纸牌游戏例子的ObserverPattern----观察者模式
- Linux进程间的通信方式之管道
- CSUOJ 1945 最简单的题目 背包问题
- 使用apt-get install安装软件时,提示could not get lock /var/lib/dpkg/lock
- [spring-boot] thymeleaf 热交换
- css笔记:HTML文档中应用css样式的方法总结
- PostgreSQL模糊匹配走索引
- 卡特兰数
- AndroidStudio中mipmap目录和drawable目录有什么区别
- swift3.1 快速上手系列(一)
- Linux 学习(六)--- 文件权限的操作