题目大意:有n个仓库,m个应聘者,每人对应一个能力值。一个人可以看多个仓库,一间仓库只能被一个人看。如果一个能力为p的人看k间仓库,那么安全系数为p/k,求出最大的最小安全系数,并且求出在此情况下所有人的能力值总和。

题目分析:这道题比较灵活,可以另仓库总数作为背包容量,也可以用应聘者总数作为背包容量。最后,求能力值总和时还需要再DP一次。

代码如下:

# include<iostream>
# include<cstring>
# include<cstdio>
# include<algorithm>
using namespace std; const int INF=1000000000; int n,m,p[35];
int dp[105][35]; int main()
{
while(scanf("%d%d",&n,&m)&&n+m)
{
for(int i=1;i<=m;++i)
scanf("%d",p+i); memset(dp,0,sizeof(dp));
for(int i=0;i<=m;++i) dp[0][i]=INF;
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
dp[i][j]=dp[i][j-1];
for(int k=1;k<=i;++k)
dp[i][j]=max(min(dp[i-k][j-1],p[j]/k),dp[i][j]);
}
}
printf("%d ",dp[n][m]);
int ans1=dp[n][m];
if(ans1==0){
printf("0\n");
continue;
} memset(dp,0,sizeof(dp));
for(int i=1;i<=n;++i) dp[i][0]=INF;
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
dp[i][j]=dp[i][j-1];
for(int k=1;k<=i;++k)
if(p[j]/k>=ans1)
dp[i][j]=min(dp[i][j],dp[i-k][j-1]+p[j]);
}
}
printf("%d\n",dp[n][m]);
}
return 0;
}

  

最新文章

  1. TortoiseSVN的合并对比工具TortoiseMerge启动时很慢很卡的解决办法
  2. 内容生成器:content、计数器、多列
  3. DP - 2016网易杭研笔试题A
  4. Android接口传递Json数组的处理方式
  5. opengl基础学习专题 (三) 多边形绘制的几种样式
  6. lintcode 中等题:Divide Two Integers 两个数的除法
  7. crontab 定时任务格式
  8. apache开源项目--Mahout
  9. Eclipse问题解决方案,不断更新
  10. ssh配置事务
  11. event.getAction()&amp;MotionEvent.ACTION_MASK的原因
  12. 怎样在Ubuntu中使用条件布局
  13. shell oracle
  14. 解决在linux环境下面不显示验证码的问题
  15. spring AOP知识点总结以及日志的输出
  16. CentOS7搭建以太坊私有链
  17. leetcode 93 复原IP地址
  18. JSP—简介
  19. scapy学习笔记(1)
  20. UEFI Protocol

热门文章

  1. C/C++之Memcpy and memmove
  2. Notepad++ 主题配色配置
  3. 02:zabbix-agent安装配置 及 web界面管理
  4. centos 安装最新稳定版本docker
  5. 20145329 《网络对抗技术》Web安全基础实践
  6. 20145329 《网络对抗技术》Web基础
  7. 面向对象初调用:foolish 电梯
  8. echart折线图,柱状图,饼图设置颜色
  9. C# 新Form各事件执行顺序
  10. 51nod 1199 Money out of Thin Air(线段树+树剖分)