poj2642 The Brick Stops Here(DP基础题)
比基础的多一点东西的背包问题。
链接:POJ2642
大意:有N种砖,每种花费p[i],含铜量c[i],现需要用M种不同的砖融成含铜量在Cmin到Cmax之间(可等于)的砖,即这M种砖的含铜量平均值在这个范围内,求最小花费。(M、Cmin、Cmax有多种需求,分别输出花费)
题解:
DP,
f[i][j]表示选i种砖,含铜量的和为j时的最小花费。这样在询问M、Cmin、Cmax之前,先将各种砖数、组成各种含铜量的花费都算好。
DP方程:f[k][j]=min(f[k][j],f[k-1][j-c[i]]+p[i])
方程其实比较容易,主要是外面的循环比较难想……
先将f全部置为inf,然后:
f[][]=;///用0个组成0只用0元
int nn=min(n,);///种类数的最大值
for(i=; i<=n; i++) {///第几个
for(k=min(i,nn); k>; k--) ///用的种类数(逆着来防止自身影响
for(j=c[i]; j<=mc; j++) {///组成的含量和
f[k][j]=min(f[k][j],f[k-][j-c[i]]+p[i]);///用k种组成含铜总量j的花费
}
}
1.为什么第几块砖放在最外层?把代表种类数的k变量放在最外层不行吗?
当然是不行的!这样各块砖会互相影响,根本没办法好好DP,必须一块一块来。
2.为什么种类数k要逆着来?
正着来会把自己刚刚算好的花费用上,也就相当于用了多次同一块砖,逆着来就不会,因为n种砖的信息不会被n+1种砖的信息影响。(如果是完全背包,也就是一种能用多次,这个就能正着来)
这个算完后,读取需求方案,从f[m][m*cmin~m*cmax]中找到最小值,如果最小值是inf就是无解。
代码:
1 #include<cstdio>
2 #include<cmath>
3 #include<iostream>
4 #include<cstring>
5 #include<algorithm>
6 #include<cmath>
7 #include<map>
8 #include<set>
9 using namespace std;
10 #define ll __int64
11 #define usint unsigned int
12 #define mz(array) memset(array, 0, sizeof(array))
13 #define minf(array) memset(array, inf, sizeof(array))
14 #define REP(i,n) for(int i=0;i<(n);i++)
15 #define RE freopen("1.in","r",stdin)
16 #define WE freopen("1.out","w",stdout)
17
18 const int maxn=200;
19 const int maxc=111;
20 const int maxcc=1000;
21 const int inf=0x3f3f3f3f;
22 const int mc=20*maxcc;///最多只要20个合一
23 int c[maxn],p[maxn];
24
25 int f[maxn][mc];///f[k][j]表示用k个组成总含量j的用钱
26
27
28 int main() {
29 int n,m,C,cmin,cmax;
30 int i,j,k,ans;
31 bool flag=false;
32 while(scanf("%d",&n)!=EOF) {
33 for(i=1; i<=n; i++)
34 scanf("%d%d",&c[i],&p[i]);
35 scanf("%d",&C);
36 minf(f);
37 f[0][0]=0;///用0个组成0只用0元
38 int nn=min(n,20);///种类数的最大值
39 for(i=1; i<=n; i++) {///第几个
40 for(k=min(i,nn); k>0; k--) ///用的种类数(逆着来防止自身影响
41 for(j=c[i]; j<=mc; j++) {///组成的含量和
42 f[k][j]=min(f[k][j],f[k-1][j-c[i]]+p[i]);///用k种组成含铜总量j的花费
43 }
44 }
45 if(flag)puts("");
46 for(k=0; k<C; k++) {
47 scanf("%d%d%d",&m,&cmin,&cmax);
48 int cma=cmax*m;
49 ans=inf;
50 for(i=cmin*m; i<=cma; i++) {
51 ans=min(f[m][i],ans);
52 }
53 if(ans==inf) printf("impossible\n");
54 else printf("%d\n",ans);
55 }
56 flag=true;
57 }
58 return 0;
59 }
poj2642 The Brick Stops Here(DP基础题)的更多相关文章
- hdu 2089 不要62 (数位dp基础题)
不要62 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- poj 2955 Brackets (区间dp基础题)
We give the following inductive definition of a “regular brackets” sequence: the empty sequence is a ...
- hdu 2845(dp基础题)
题意:容易理解. 分析:以后碰到这种类型的题,就要考虑把矩阵先按行来处理,再按列处理.先算出每行能够能够得到的最大值,然后按列处理即可. 代码实现: #include<stdio.h> # ...
- 51Nod 1083 矩阵取数问题(矩阵取数dp,基础题)
1083 矩阵取数问题 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 一个N*N矩阵中有不同的正整数,经过这个格子,就能获得相应价值的奖励,从左上走到右下,只能向下 ...
- HDU3853 LOOPS 期望DP基础题
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3853 题目大意(只是大意,名字什么的可能和原题描述不一样~): 爱丽丝与华容道 题目描述 爱丽丝是一个 ...
- UVA103 dp基础题,DAG模型
1.UVA103 嵌套n维空间 DAG模型记忆化搜索,或者 最长上升子序列. 2.dp[i]=max( dp[j]+1),(第i个小于第j个) (1) //DAG模型记忆化搜索 #include< ...
- POJ Corn Fields 状态压缩DP基础题
题目链接:http://poj.org/problem?id=3254 题目大意(名称什么的可能不一样,不过表达的意思还是一样的): 种玉米 王小二从小学一年级到现在每次考试都是班级倒数第一名,他的爸 ...
- POJ 2342 Anniversary party 树形DP基础题
题目链接:http://poj.org/problem?id=2342 题目大意:在一个公司中,每个职员有一个快乐值ai,现在要开一个party,邀请了一个员工就不可能邀请其直属上司,同理邀请了一个人 ...
- 牛客假日团队赛5 K 金币馅饼 (DP 基础题)
链接:https://ac.nowcoder.com/acm/contest/984/K 来源:牛客网 金币馅饼 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言 ...
随机推荐
- 20135306黄韧 附录A及第十章学习总结
附录A 错误处理 A.1 Unix系统中的错误处理 1.Unix风格的错误处理 if ((pid = wait(NULL)) < 0) { fprintf(stderr,”wait error ...
- C#本质论读书笔记:第一章 C#概述|第二章 数据类型
第一章 1.字符串是不可变的:所有string类型的数据,都不可变,也可以说是不可修改的,不能修改变量最初引用的数据,只能对其重新赋值,让其指向内存中的一个新位置. 第二章 2.1 预定义类型或基本类 ...
- 测试技能积木-AWK的简要用法
做测试工作,经常要分析日志,有的时候活儿还很脏很累,比如抽取符合某些pattern的行,重新格式化等等.有的时候,我们需要也创造一些测试用数据文件.基于上述两种原因,在Unix Like 系统上,一些 ...
- [USACO2005][poj2229]Sumsets(递推)
http://poj.org/problem?id=2229 分析: 显然的递推 若n为奇数,那么肯定是在n-1的基础上前面每个数+1,即f[n]=f[n-1] 若n为偶数 当第一位数字是1的时候,等 ...
- [USACO 3.1.4]rect1(漂浮法/矩形切割)
描述 N个不同的颜色的不透明的长方形(1 <= N <= 1000)被放置在一张横宽为A竖长为B的白纸上. 这些长方形被放置时,保证了它们的边与白纸的边缘平行. 所有的长方形都放置在白纸内 ...
- Linq之延迟加载特性
目录 写在前面 系列文章 延迟加载 总结 写在前面 上篇文章介绍了linq中常见的几个关键字,并列举了几个例子,算是对linq如何使用有了初步了解.上篇文章中也提到了,能够使用linq的场合有一个要求 ...
- 多个TableView的练习
效果图: 左边图片的代码: // // SecViewController.m // UI__多个TableView练习 // // Created by dllo on 16/3/17. // Co ...
- “耐撕”团队 2016.04.08 站立会议
1. 时间 : 15:20--15:40 2. 人员 : Z 郑蕊 * 组长 (博客:http://www.cnblogs.com/zhengrui0452/), P 濮成林(博客:http://ww ...
- HTML布局篇之双飞翼(圣杯)布局
最近在写页面的时候,总是为布局头疼,倒不是不能布出来,就是感觉不系统,没有成一个体系的感觉.所以决定自己写博文,梳理一下思路. 常用的布局方式大致可以分为三种: 浮动布局 Float 负边距(双飞翼) ...
- Qt学习思考
对各个部件基本了解,初步理解GUI应用程序的创建 2D图形文字绘制,3D图形(openGL)等 模型/视图框架编程,处理复杂的数据 多媒体框架 数据库,xml,文件读写等 网络编程 做出比较美观的界面 ...