给出 n 个物品,第 i 个物品有重量 w i 。现在有 m 个背包,第 i 个背包的限重为 c i ,求最少用几个背 包能装下所有的物品。

Input

输入的第一行两个整数 n, m ( n ≤ 24 , m ≤ 100) 。 
接下来一行 n 个整数,描述 w ( w i ≤ 10^8 ) 。 
接下来一行 m 个整数,描述 c ( c i ≤ 10^8 ) 。

Output

输出一行一个整数,描述最少需要使用的背包数。如果没有可行的方案来装下所有物品,请输出”NIE” (不含引号)。

题解:O(∩_∩)O谢谢出这套题目的学长,题目出的很好,好了,对于这个题目,因为我们要选择几个信息或者说记住几个特征,既可以描述所以的状态又方便转移,显然这个题状态很直接,我们显然要记住这个序列的所有物品是否被选,还要记住,当前用了几个背包,
还要知道当前的背包还剩多少,所有可以状压一个2进制数i表示那些物品是否被选,设dp[i]表示要装下i最少要多少个背包,然后rest[i]
表示用了dp[i]个背包后还有一部分剩下的重物放在第dp[i]+1个背包的重量,那么转移就是显然的了。注意我是用记忆化搜索,如果dp[i]<n说明这个状态已经算过了,就可以直接返回了。
 
代码:

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
#include<cstring>
using namespace std;
short dp[];int use[];
int wu[],bao[],n,m,inf; void cl(){
memset(wu,,sizeof(wu));
memset(bao,,sizeof(bao));
memset(dp,,sizeof(dp));
memset(use,,sizeof(use));
inf=use[];
} bool comp(int x,int y){
if(x>y) return ;
return ;
} void dfs(int x){
if(dp[x]<n) return;
int q=inf,p=inf;
for(int now=;now<=n;now++){
if(x&(<<(now-))){
int r=x-(<<(now-));
dfs(r);
if(bao[dp[r]+]-use[r]>=wu[now]) q=dp[r],p=use[r]+wu[now];
else if(bao[dp[r]+]>=wu[now]&&bao[dp[r]+]>=wu[now]) q=dp[r]+,p=wu[now];
else continue;
if(q<dp[x]) dp[x]=q,use[x]=p;
else if(q==dp[x]&&p<use[x]) use[x]=p;
}
}
} int main(){
cl();
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) scanf("%d",&wu[i]);
for(int i=;i<=m;i++) scanf("%d",&bao[i]);
sort(wu+,wu+n+,comp);
sort(bao+,bao+m+,comp);
if(bao[]<wu[]) {printf("NIE");return ;}
dp[]=use[]=;
dfs((<<n)-);
if(dp[(<<n)-]>m) printf("NIE");
else printf("%d",dp[(<<n)-]+(use[(<<n)-]>));
return ;
}

【DP合集】m-knapsack的更多相关文章

  1. dp合集 广场铺砖问题&&硬木地板

    dp合集 广场铺砖问题&&硬木地板 很经典了吧... 前排:思想来自yali朱全民dalao的ppt百度文库免费下载 后排:STO朱全民OTZ 广场铺砖问题 有一个 W 行 H 列的广 ...

  2. 9.15 DP合集水表

    9.15 DP合集水表 显然难了一些啊. 凸多边形的三角剖分 瞄了一眼题解. 和蛤蛤的烦恼一样,裸的区间dp. 设f[i][j]表示i~j的点三角剖分最小代价. 显然\(f[i][i+1]=0,f[i ...

  3. 9.14 DP合集水表

    9.14 DP合集水表 关键子工程 在大型工程的施工前,我们把整个工程划分为若干个子工程,并把这些子工程编号为 1. 2. --. N:这样划分之后,子工程之间就会有一些依赖关系,即一些子工程必须在某 ...

  4. 【CJOJ2498】【DP合集】最长上升子序列 LIS

    题面 Description 给出一个 1 ∼ n (n ≤ 10^5) 的排列 P 求其最长上升子序列长度 Input 第一行一个正整数n,表示序列中整数个数: 第二行是空格隔开的n个整数组成的序列 ...

  5. CJOJ 【DP合集】最长上升序列2 — LIS2

    题面 已知一个 1 ∼ N 的排列的最长上升子序列长度为 K ,求合法的排列个数. 好题(除了我想不出来我应该找不到缺点), 想一想最长上升子序列的二分做法, 接在序列后面或者替换. 所以对于每一个位 ...

  6. 【DP合集】tree-knapsack

    Description 给出一个 N 个节点的有根树,点编号 1 ∼ N ,编号为 i 的点有权值 v i .请选出一个包含树根的,点数 不超过 K 的连通块,使得点权和最大. Input 输入的第一 ...

  7. 【DP合集】背包 bound

    N 种物品,第 i 种物品有 s i 个,单个重量为 w i ,单个价值为 v i .现有一个限重为 W 的背包,求能容 纳的物品的最大总价值. Input 输入第一行二个整数 N , W ( N ≤ ...

  8. 【DP合集】合并 union

    给出一个 1 ∼ N 的序列 A ( A 1 , A 2 , ..., A N ) .你每次可以将两个相邻的元素合并,合并后的元素权值即为 这两个元素的权值之和.求将 A 变为一个非降序列,最少需要多 ...

  9. 【DP合集】棋盘 chess

    给出一张 n × n 的棋盘,格子有黑有白.现在要在棋盘上放棋子,要求: • 黑格子上不能有棋子 • 每行每列至多只有一枚棋子 你的任务是求出有多少种合法的摆放方案.答案模 109+7109+7 . ...

随机推荐

  1. PHP 异或 算法

    /** * PHP字符串“异或”算法 * param array key * @param Request $request * @return mixed|string|void */ public ...

  2. FreeSql (十四)批量更新数据

    FreeSql支持丰富的更新数据方法,支持单条或批量更新,在特定的数据库执行还可以返回更新后的记录值. var connstr = "Data Source=127.0.0.1;Port=3 ...

  3. 关于设置tomcat端口为80的事

    今天有人要求tomcat服务器的访问地址不能带端口访问, 也就是说只能用80端口访问网站. 那么问题来了, Ubuntu系统禁止root用户以外的用户访问1024以下的商品, 因此tomcat 默认为 ...

  4. 小程序·云开发的HTTP API调用丨实战

    小程序云开发之httpApi调用. 小程序云开发之httpApi调用(返回"47001处理") 技术栈 采用 nodejs + express 搭建web服务器,采用 axios ...

  5. 松软科技课堂:索引器计时器Timer

    在.NET中有三种计时器:1.System.Windows.Forms命名空间下的Timer控件,它直接继承自Componet.Timer控件只有绑定了Tick事件和设置Enabled=True后才会 ...

  6. Springboot+Shiro+Mybatis+mysql

    一 .shiro框架 Shiro是Apache 的一个强大且易用的Java安全框架,执行身份验证.授权.密码学和会话管理.Shiro 主要分为两个部分就是认证和授权两部分 1.Subject代表了当前 ...

  7. 无法解析的外部符号,该符号在xxx函数中被引用

    无法解析的外部符号.........,该符号在函数.........被引用 在我们敲代码的过程中,我们偶尔会遇到这个问题,这个问题大多数都是因为你自己的程序有问题,而不是缺少相应的库文件.话不多说,直 ...

  8. query 与 params 使用

    这个是路由: {     path:'/city/:city',     name:'City',     component:City   }   下面使用query和params分别传参 quer ...

  9. Vue学习之todolist删除功能

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. 使用 Fabric 自动化部署 Django 项目

    作者:HelloGitHub-追梦人物 文中涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 在上一篇教程中,我们通过手工方式将代码部署到了服务器.整个过程涉及到十几条命令,输了 ...