<题目链接>

题目大意:

有n个瓶子,各有水量和容量。现在要将这写瓶子里的水存入最少的瓶子里。问你最少需要的瓶子数?在保证瓶子数最少的情况下,要求转移的水量最少。

解题分析:
首先,最少的瓶子数肯定可以通过贪心来简单求解。然后就是将所有瓶子的水量作为01背包的总体积,然后就是$dp[i][j]$表示前$i$个物品选了水量为$j$的最大容量。本题的这种逆向思维有点像那道小偷抢银行的01背包题。但是因为本题规定了需要选取的那些容量大的物品,所以略有不同。对这$n$个物品进行01背包,杯子的水量看成体积,容量看成价值,同时枚举上一个物品,进行状态的转移。最后倒序遍历水量,一旦碰到容量大于等于总水量的情况即可输出。

#include <bits/stdc++.h>
using namespace std; const int N = ;
int n,sum,dp[N][N*N];
//dp[i][j]表示前i个物品水量为j(所选物品的水量之和)的最小容量 struct Node{ int flow,cal; }node[N]; inline bool cmp(Node tmp1,Node tmp2){ return tmp1.cal>tmp2.cal; } int main(){
cin>>n;
for(int i=;i<=n;i++)
cin>>node[i].flow,sum+=node[i].flow;
for(int i=;i<=n;i++)cin>>node[i].cal;
sort(node+,node++n,cmp);
int totcal=,num;
for(int i=;i<=n;i++){
totcal+=node[i].cal;
if(totcal>=sum){ num=i;break; } //求解出最少需要多少个杯子
}
memset(dp,-,sizeof(dp));
dp[][]=;
for(int i=;i<=n;i++){ //将水量看成体积,将容量看成价值
for(int j=sum;j>=node[i].flow;j--){
for(int pre=i-;pre>=;pre--) if(dp[pre][j-node[i].flow]!=-){ //枚举上一个物品,进行状态的转移
dp[pre+][j]=max(dp[pre+][j],dp[pre][j-node[i].flow]+node[i].cal);
}
}
}
int loc;
for(int i=sum;i>=;i--) if(dp[num][i]>=sum){ //找到符合要求的最大流量
loc=i;break;
}
printf("%d %d\n",num,sum-loc); //sum-loc即需要转移的流量
}

Codeforces 730 J.Bottles (01背包)的更多相关文章

  1. codeforces 730 j.bottles

    J. Bottles time limit per test 2 seconds memory limit per test 512 megabytes input standard input ou ...

  2. Codeforces 730J:Bottles(背包dp)

    http://codeforces.com/problemset/problem/730/J 题意:有n个瓶子,每个瓶子有一个当前里面的水量,还有一个瓶子容量,问要把所有的当前水量放到尽量少的瓶子里至 ...

  3. HDU2191--多重背包(二进制分解+01背包)

    悼念512汶川大地震遇难同胞--珍惜现在,感恩生活 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Jav ...

  4. 题解报告:hdu 1203 I NEED A OFFER!(01背包)

    Problem Description Speakless很早就想出国,现在他已经考完了所有需要的考试,准备了所有要准备的材料,于是,便需要去申请学校了.要申请国外的任何大学,你都要交纳一定的申请费用 ...

  5. Codeforces 741B:Arpa's weak amphitheater and Mehrdad's valuable Hoses(01背包+并查集)

    http://codeforces.com/contest/741/problem/B 题意:有 n 个人,每个人有一个花费 w[i] 和价值 b[i],给出 m 条边,代表第 i 和 j 个人是一个 ...

  6. CodeCraft-19 and Codeforces Round #537 (Div. 2) D 多重排列 + 反向01背包 + 离线处理

    https://codeforces.com/contest/1111/problem/D 多重排列 + 反向01背包 题意: 给你一个字符串(n<=1e5,n为偶数),有q个询问,每次询问两个 ...

  7. Codeforces Round #383 (Div. 2) D. Arpa's weak amphitheater and Mehrdad's valuable Hoses —— DP(01背包)

    题目链接:http://codeforces.com/contest/742/problem/D D. Arpa's weak amphitheater and Mehrdad's valuable ...

  8. 01背包 Codeforces Round #267 (Div. 2) C. George and Job

    题目传送门 /* 题意:选择k个m长的区间,使得总和最大 01背包:dp[i][j] 表示在i的位置选或不选[i-m+1, i]这个区间,当它是第j个区间. 01背包思想,状态转移方程:dp[i][j ...

  9. codeforces 688 E. The Values You Can Make(01背包+思维)

    题目链接:http://codeforces.com/contest/688/problem/E 题解:设dp[s1][s2]表示s1状态下出现s2是否合理.那么s1显然可以更具01背包来得到状态.首 ...

随机推荐

  1. Markdown初入门(使用Typora编辑)

    标题 使用#来实现标题的大小控制 # h1 标题1 ## h2 标题2 ### h3 标题3 #### h4 标题4 ##### h5 标题5 ###### h6 标题6 标题一 标题二 标题三 标题 ...

  2. To the moon HDU - 4348 (主席树,区间修改)

    Background To The Moon is a independent game released in November 2011, it is a role-playing adventu ...

  3. 2018年秋季学期《c语言程序设计》助教总结

    <c语言程序设计>第七周助教总结 <c语言程序设计>第八周助教总结 <c语言程序设计>第九周助教总结 <c语言程序设计>第十周助教总结 <c语言程 ...

  4. JENKINS针对不同项目组对用户进行权限分配

    权限需求 因JENKINS上存有de(开发).te(测试).re(预发布)等三个不同环境的项目,同时因为项目需求,需要对不同的开发及测试人员配置不同的jenkins权限,即以项目为单位,对不同人员进行 ...

  5. 跨站请求伪造 | ajax

    一.简介 django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成.而对于django中设置防跨站请求伪造功 ...

  6. SSH框架之Hibernate《一》

    hibernate的基础入门 一:hibernate和ORM的概念部分         1.1hibernate概述:             Hibernate框架是当今主流的Java持久层框架之一 ...

  7. 非极大值抑制(NMS)

    转自:https://www.cnblogs.com/makefile/p/nms.html 概述 非极大值抑制(Non-Maximum Suppression,NMS),顾名思义就是抑制不是极大值的 ...

  8. mybatis查询语句获取自增主键

    第一种方式: 主键回填useGeneratedKeys 代表采用JDBC的Statment对象的getGeneratedKeys方法返回主键keyProperty 代表将用哪个POJO的属性去匹配这个 ...

  9. Python日志模块logging用法

    1.日志级别 日志一共分成5个等级,从低到高分别是:DEBUG INFO WARNING ERROR CRITICAL. DEBUG:详细的信息,通常只出现在诊断问题上 INFO:确认一切按预期运行 ...

  10. CentOS 安装 ceph 单机版

    简介 Ceph是一个分布式存储软件. 它支持用3种方式存储数据,分别是:对象存储.块设备存储.分布式文件系统存储. Ceph这个软件,分为3层,最底层是Rados对象存储系统.中间是一个librado ...