The Prices
题目描述
你要购买\(m\)种物品各一件,一共有\(n\)家商店,你到第\(i\)家商店的路费为\(d[i]\),在第家商店购买第\(j\)种物品的费用为\(c[i][j]\),求最小总费用。
输入格式
第一行包含两个正整数\(n,m(1<=n<=100,1<=m<=16)\),表示商店数和物品数。
接下来\(n\)行,每行第一个正整数\(d[i](1<=d[i]<=1000000)\)表示到第\(i\)家商店的路费,接下来\(m\)个正整数,依次表示\(c[i][j](1<=c[i][j]<=100000)\)。
输出格式
一个正整数,即最小总费用。
样例
样例输入
3 4
5 7 3 7 9
2 1 20 3 2
8 1 20 1 1
样例输出
16
题解
- 看数据,\(m≤16\),明显小于20,首先想到状压dp 。
- 定义:\(dp[i][j]\) 表示前 \(i\) 个商店,买东西的状态为 \(j\) 时的最小花费。
- 首先枚举每个商家,然后加上路费。注意如果两次在同一条路上,需要减去重复的路费,路费只算一遍!!!
- 然后枚举第i个商家的m件商品,并进行状态转移条件判断:想买第k件商品,则前i-1个商家没有买k,所以j的二进制的第k为0
- 然后状态转移方程就很简单:
dp[i][j|(1<<k-1)]=min(dp[i][j|(1<<k-1)],dp[i][j]+a[i][k]); - 最后就不买第i个商家的物品和买第i个商家的物品的情况进行比较,选出最优解。
code
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn=(1<<16)+5;
int dp[105][maxn],a[105][20],d[105];
int main(){
int n,m;scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i){
scanf("%d",&d[i]);
for(int j=1;j<=m;++j)
scanf("%d",&a[i][j]);
}
memset(dp,0x3f,sizeof(dp));
dp[0][0]=0;
int Max=1<<m;
for(int i=1;i<=n;++i){
for(int j=0;j<Max;++j)
dp[i][j]=dp[i-1][j]+d[i];
for(int k=1;k<=m;++k)
for(int j=0;j<Max;++j)
if(~j & (1<<k-1))
dp[i][j|(1<<k-1)]=min(dp[i][j|(1<<k-1)],dp[i][j]+a[i][k]);
for(int j=0;j<Max;++j)
dp[i][j]=min(dp[i][j],dp[i-1][j]);
}
printf("%d\n",dp[n][Max-1]);
return 0;
}
The Prices的更多相关文章
- hdu 4163 Stock Prices 水
#include<bits/stdc++.h> using namespace std; #define ll long long #define pi (4*atan(1.0)) #de ...
- BZOJ 4145: [AMPPZ2014]The Prices( 状压dp + 01背包 )
我自己只能想出O( n*3^m )的做法....肯定会T O( nm*2^m )做法: dp( x, s ) 表示考虑了前 x 个商店, 已买的东西的集合为s. 考虑转移 : 先假设我们到第x个商店去 ...
- Kaggle竞赛 —— 房价预测 (House Prices)
完整代码见kaggle kernel 或 Github 比赛页面:https://www.kaggle.com/c/house-prices-advanced-regression-technique ...
- Kaggle:House Prices: Advanced Regression Techniques 数据预处理
本博客是博主在学习了两篇关于 "House Prices: Advanced Regression Techniques" 的教程 (House Prices EDA 和 Comp ...
- 【BZOJ】【4145】【AMPPZ2014】The Prices
状压DP/01背包 Orz Gromah 容易发现m的范围很小……只有16,那么就可以状压,用一个二进制数来表示买了的物品的集合. 一种简单直接的想法是:令$f[i][j]$表示前$i$个商店买了状态 ...
- hdu 4163 Stock Prices 花式排序
Stock Prices Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- 【BZOJ4145】[AMPPZ2014]The Prices 状压DP
[BZOJ4145][AMPPZ2014]The Prices Description 你要购买m种物品各一件,一共有n家商店,你到第i家商店的路费为d[i],在第i家商店购买第j种物品的费用为c[i ...
- CF1234A Equalize Prices
洛谷 CF1234A Equalize Prices Again 洛谷传送门 题目描述 You are both a shop keeper and a shop assistant at a sma ...
- Codeforces Round #590 (Div. 3) A. Equalize Prices Again
链接: https://codeforces.com/contest/1234/problem/A 题意: You are both a shop keeper and a shop assistan ...
- Eqaulize Prices
There are n products in the shop. The price of the ii-th product is aiai. The owner of the shop want ...
随机推荐
- 【Java】错误: 需要class, interface或enum
今天在用cmd实现mvn package操作时跳出来的报错! 网上搜索到的结论是因为编码问题而产生的,具体原因就不深究了 要详细了解可以查看以下链接https://blog.csdn.net/qq_3 ...
- java中值传递
最近学基础的时候,老师讲了值传递和引用传递,这个问题一直不太明白,上网查了很多资料,按照自己的理解整理了一遍,发现之前不太明白的地方基本上想明白了,如有不正确的地方,欢迎指正,谢谢. 首先要说明的是j ...
- 微信小程序-超出部分显示省略号(单行与多行)
/*单行*/ .work_font{ display:block /*这里设置inline-block或者block:根据使用情况来定(行内元素需要加这个,块级元素和行内块级可以不用)*/ white ...
- 一起玩转微服务(13)——AOP
一.什么是AOP编程 AOP: Aspect Oriented Programming 面向切面编程. 面向切面编程(也叫面向方面):Aspect Oriented Programming(AOP), ...
- jmeter在non-GUI模式下用法
用法 jmeter -n -t HTTPRequesttest.jmx -l testHistory/testResult.jtl -e -o testHistory/testReport 参数说明 ...
- mpvue实战-手势滑动导航栏
写点东西记录一下美好时光,上周学习了一下通过mpuve开发微信小程序,看完文档,就准备撸起袖子加油干的时候,一开始就被支持手势滑动的导航栏给搞懵逼了.求助一波百度和谷歌未果后,只能自己动脑动手!为了给 ...
- 11. RobotFramework内置库-Collections
Collections库是RobotFramework用来处理列表和字典的库,详细可参见官方介绍. 官方地址:http://robotframework.org/robotframework/late ...
- Python中的错误和异常
前言 错误是程序中的问题,由于这些问题而导致程序停止执行.另一方面,当某些内部事件发生时,会引发异常,从而改变程序的正常流程. python中会发生两种类型的错误. 语法错误 逻辑错误(异常) 语法错 ...
- Mybatis一对一映射resultMap子标签中顺序问题
直接上图 鼠标点上红线出现如下提示 The content of element type "resultMap" must match "(constructor?, ...
- web前端开发书籍推荐_css/css3的好书有哪些?
css/css3样式已是web前端开发的主流技术了.每个优秀的前端程序员都应该熟悉,甚至精通css.那么要如何才能学好css,并很好的应用到实际开发中,这篇文章就推荐一些关于css相关的书籍给大家. ...