【BZOJ】【4145】【AMPPZ2014】The Prices

状压DP/01背包


  Orz Gromah

  容易发现m的范围很小……只有16,那么就可以状压,用一个二进制数来表示买了的物品的集合。

  一种简单直接的想法是:令$f[i][j]$表示前$i$个商店买了状态集合为$j$的商品的最小代价,那么我们转移的时候就需要枚举在第$i$个商店买了哪些商品吗,这样的话带上枚举子集,复杂度就会变成$O(n*3^m)$,并不是我们能够忍受的……

  那么怎么搞呢?我们每次转移的时候,不再枚举子集,而是搞一个类似01背包的东西:(以下来自Gromah)

  我们首先令$f[i][j]=f[i-1][j]+d[i]$,表示到达第$i$个商店。

  然后枚举每个状态$j$,以及每个不在$j$里的物品$k$,令:$$f[i][j+\{k\}]=min(f[i][j+\{k\}],f[i][j]+cost[i][k])$$

  这个过程就相当于是进行了一次01背包。

  最后还要令$f[i][j]=min(f[i][j],f[i-1][j])$看看在商店$i$时的购买计划是否划算。

  时间复杂度$O(nm2^m)$,空间复杂度$O(n2^m)$。

 1 /**************************************************************
 2     Problem: 4145
 3     User: Tunix
 4     Language: C++
 5     Result: Accepted
 6     Time:6948 ms
 7     Memory:29440 kb
 8 ****************************************************************/
 9  
10 //BZOJ 4145
11 #include<cstdio>
12 #include<cstring>
13 #include<cstdlib>
14 #include<iostream>
15 #include<algorithm>
16 #define rep(i,n) for(int i=0;i<n;++i)
17 #define F(i,j,n) for(int i=j;i<=n;++i)
18 #define D(i,j,n) for(int i=j;i>=n;--i)
19 #define pb push_back
20 using namespace std;
21 typedef long long LL;
22 inline int getint(){
23     int r=1,v=0; char ch=getchar();
24     for(;!isdigit(ch);ch=getchar()) if (ch=='-') r=-1;
25     for(; isdigit(ch);ch=getchar()) v=v*10-'0'+ch;
26     return r*v;
27 }
28 const int N=110,M=1<<16,INF=0x3f3f3f3f;
29 /*******************template********************/
30  
31 int n,m,f[N][M],d[N],c[N][20];
32 int main(){
33 #ifndef ONLINE_JUDGE
34     freopen("4145.in","r",stdin);
35     freopen("4145.out","w",stdout);
36 #endif
37     n=getint(); m=getint();
38     F(i,1,n){
39         d[i]=getint();
40         rep(j,m) c[i][j]=getint();
41     }
42     rep(j,1<<m) f[0][j]=INF;
43     f[0][0]=0;
44     F(i,1,n){
45         rep(j,1<<m) f[i][j]=f[i-1][j]+d[i];
46         rep(j,1<<m) rep(k,m){
47             int s=1<<k;
48             if ((j&s)==0) f[i][j^s]=min(f[i][j^s],f[i][j]+c[i][k]);
49         }
50         rep(j,1<<m) f[i][j]=min(f[i][j],f[i-1][j]);
51     }
52     printf("%d\n",f[n][(1<<m)-1]);
53     return 0;
54 }
55 
View Code

4145: [AMPPZ2014]The Prices

Time Limit: 20 Sec  Memory Limit: 256 MB
Submit: 70  Solved: 47
[Submit][Status][Discuss]

Description

你要购买m种物品各一件,一共有n家商店,你到第i家商店的路费为d[i],在第i家商店购买第j种物品的费用为c[i][j],
求最小总费用。

Input

第一行包含两个正整数n,m(1<=n<=100,1<=m<=16),表示商店数和物品数。
接下来n行,每行第一个正整数d[i](1<=d[i]<=1000000)表示到第i家商店的路费,接下来m个正整数,
依次表示c[i][j](1<=c[i][j]<=1000000)。

Output

一个正整数,即最小总费用。

Sample Input

3 4
5 7 3 7 9
2 1 20 3 2
8 1 20 1 1

Sample Output

16

HINT

在第一家店买2号物品,在第二家店买剩下的物品。


Source

鸣谢Claris上传

[Submit][Status][Discuss]

转载于:https://www.cnblogs.com/Tunix/p/4593542.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/291001.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java中的String,StringBuilder,StringBuffer三者的区别

最近在学习Java的时候&#xff0c;遇到了这样一个问题&#xff0c;就是String,StringBuilder以及StringBuffer这三个类之间有什么区别呢&#xff0c;自己从网上搜索了一些资料&#xff0c;有所了解了之后在这里整理一下&#xff0c;便于大家观看&#xff0c;也便于加深自己学习…

WPF 实现人脸检测

WPF开发者QQ群此群已满340500857 &#xff0c;请加新群458041663由于微信群人数太多入群请添加小编微信号yanjinhuawechat 或 W_Feng_aiQ 邀请入群需备注WPF开发者 PS&#xff1a;有更好的方式欢迎推荐。接着上一篇利用已经训练好的数据文件,检测人脸 地址如下&#xff1a;http…

C++之函数的默认值参数说明

1、思考 今天看到C代码的时候&#xff0c;发现文件里面的函数定义和实现都有3个参数&#xff0c;特码调用的时候只有2个参数了&#xff0c;日了狗&#xff0c;java里面好像没有这种方式&#xff0c;后来才发现是默认参数 2、代码实现 3、展示结果 4、总结 注意默认参数需要写…

如何用c语言验证一个定理,验证动量定理方法一

【目的和要求】验证物体做直线运动时&#xff0c;其动量的增量等于合外力的冲量&#xff0c;以加深学生对动量定理的理解。【仪器和器材】电磁打点计时器(J0203型)&#xff0c;学生电源(J1202型)&#xff0c;斜面(带定滑轮)&#xff0c;小车&#xff0c;纸带&#xff0c;天平(托…

Merge Two Sorted Lists leetcode java

题目&#xff1a; Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists. 题解&#xff1a;这道题是链表操作题&#xff0c;题解方法很直观。首先&#xff0c;进行边界条件判断&am…

插头DP

AC HDU1693 不能再简单了的插头DP 1 #include <cstdio>2 #include <fstream>3 #include <iostream>4 5 #include <cstdlib>6 #include <cstring>7 #include <algorithm>8 #include <cmath>9 10 #include <queue>11 #include…

自定义控件详解(四):Paint 画笔路径效果

Paint 画笔 &#xff0c;即用来绘制图形的"笔" 前面我们知道了Paint的一些基本用法&#xff1a; paint.setAntiAlias(true);//抗锯齿功能 paint.setColor(Color.RED); //设置画笔颜色 paint.setStyle(Style.FILL);//设置填充样式 paint.setStrokeWidth(10);//设…

C++之undefined reference to “ssl::first::first()“

1、错误 只写了一个简单的C继承类&#xff0c;就出现了这个错误 undefined reference to "ssl::first::first()" 2、原因 我在second类里面继承了first类&#xff0c;但是在first类里面&#xff0c;我把构造函数写成了 first();然后这个函数有没有实现&#xff0c;…

qt中c语言怎么显示图片和文字,Qt中在图片上叠加显示文字

如何在win7上安装ant-design1.首先要安装务必确认 Node.js 已经升级到 v4.x 或以上. 2.打开cmd,输入"npm install antd-init -g",安装antd(可以自己先指定安装目 ...&lbrack;TopCoder&rsqb; SRM&lowbar;594&lowbar;DIV2&period;250好长一段时间没…

2021 .NET Conf China 主题分享之-轻松玩转.NET大规模版本升级

去年.NET Conf China 技术大会上&#xff0c;我给大家分享了主题《轻松玩转.NET大规模版本升级》&#xff0c;今天把具体分享的内容整理成一篇博客&#xff0c;供大家研究参考学习。一、先说一下技术挑战和业务背景我们公司&#xff1a;特来电新能源股份有限公司&#xff1a;中…

HDU4462-稻草人

思想不难&#xff0c;代码不易&#xff0c;且敲且珍惜。 枚举的方式&#xff0c;假设有十个位置可以放稻草人&#xff0c;用二进制的形式转换一下&#xff0c;对每种情况判断是否全被覆盖&#xff0c;记录成功时稻草人的个数&#xff0c;每次比较选出最小的。 注意一个陷阱&…

OC-归档和解归档

1 //归档:将对象数据存储到文件的过程 NSArchiver2 //反归档:从文件中读取数据到对象中的过程3 4 int main(int argc, const char * argv[]) {5 autoreleasepool {6 7 #if 08 //使用系统的方法进行归档 NSArchiver9 NSDictionary *mutDic [NSMu…

推荐电影 奥黛丽赫本的十大经典电影 1953-1989

奥黛丽赫本的十部经典电影 1.《罗马假日》 &#xff08;Roman Holiday&#xff0c;1953&#xff09; 导演&#xff1a;威廉惠勒 风情指数★★★★★ 看点&#xff1a;奥黛丽赫本和格里高利派克的完美组合 如果没有奥黛丽赫本&#xff0c;或许《罗马假日》只会作为一部平庸…

C和C++之用extern “C“实现它们之间的互调

1、extern "C"的解释 一个C++程序包含其它语言编写的部分代码。C++编写的代码片段可能被使用在其它语言编写的代码中,不同语言编写的代码互相调用是困难的,甚至是同一种编写的代码但不同的编译器编译的代码。例如,不同语言和同种语言的不同实现可能会在注册变…

ASP.NET Core基于滑动窗口算法实现限流控制

前言在实际项目中&#xff0c;为了保障服务器的稳定运行&#xff0c;需要对接口的可访问频次进行限流控制&#xff0c;避免因客户端频繁请求导致服务器压力过大。而AspNetCoreRateLimit[1]是目前ASP.NET Core下最常用的限流解决方案。查看它的实现代码&#xff0c;我发现它使用…

android 资源文件获取啥退,重拾Android之路之获得各种资源文件的方法

引言通常我们会在项目中频繁获取color、raw、drawable、mipmap、string等资源文件。因此&#xff0c;今天整理下获取资源文件的工具类方法。最新通用方法ContextCompat.getColor(this,R.color.activity_bg);ContextCompat.getDrawable(this,R.drawable.leak_canary_icon);最近在…

linux操作系统cp命令

转载于:https://www.cnblogs.com/skl374199080/p/3863918.html

WPF将数据库和GridView绑定并更改GridView模板

首先来看一下如何使用GridView,在前台的话代码如下&#xff1a;这里仅仅举出一个例子&#xff0c;GridView是作为子项嵌套在ListView中的&#xff0c;这里的数据源是通过绑定的方式来绑定到GridView中的。 <ListView Margin"15,115,15,48" Name"lstProducts&…

sql必读的九本书

2019独角兽企业重金招聘Python工程师标准>>> 原文地址 直接上书(书籍以后会陆续加上去)书籍下载地址 《MySQL必知必会》《SQL学习指南&#xff08;第2版 修订版&#xff09;》《MySQL技术内幕——InnoDB存储引擎》《Redis设计与实现》《ZooKeeper&#xff1a;分布式…

C语言之加入头文件<stdbool.h>可以使用true和false

1、头文件<stdbool.h>介绍 &#xff08;1&#xff09;使用了<stdbool.h>后&#xff0c;可使用true和false来表示真假。 &#xff08;2&#xff09;在循环语句中进行变量声明是C99中才有的&#xff0c;因此编译时显式指明 gcc -stdc99 prime.c 2、最简单的例子 3、…