博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj2642 The Brick Stops Here(DP基础题)
阅读量:6645 次
发布时间:2019-06-25

本文共 2157 字,大约阅读时间需要 7 分钟。

比基础的多一点东西的背包问题。

链接:

大意:有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,然后:

1         f[0][0]=0;///用0个组成0只用0元2         int nn=min(n,20);///种类数的最大值3         for(i=1; i<=n; i++) {
///第几个4 for(k=min(i,nn); k>0; k--) ///用的种类数(逆着来防止自身影响5 for(j=c[i]; j<=mc; j++) {
///组成的含量和6 f[k][j]=min(f[k][j],f[k-1][j-c[i]]+p[i]);///用k种组成含铜总量j的花费7 }8 }

1.为什么第几块砖放在最外层?把代表种类数的k变量放在最外层不行吗?

当然是不行的!这样各块砖会互相影响,根本没办法好好DP,必须一块一块来。

2.为什么种类数k要逆着来?

正着来会把自己刚刚算好的花费用上,也就相当于用了多次同一块砖,逆着来就不会,因为n种砖的信息不会被n+1种砖的信息影响。(如果是完全背包,也就是一种能用多次,这个就能正着来)

 

这个算完后,读取需求方案,从f[m][m*cmin~m*cmax]中找到最小值,如果最小值是inf就是无解。

代码:

1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #include
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
View Code

转载于:https://www.cnblogs.com/yuiffy/p/3885193.html

你可能感兴趣的文章
Java之品优购部署_day01(1)
查看>>
理解VueJs模板
查看>>
百度i账户荣膺2018全球物联网大会最佳创新合作伙伴奖
查看>>
智能分布式保护测控单元综合测控通信单元
查看>>
使用函数计算对表格存储中数据做简单清洗
查看>>
【技术解析】如何用Docker实现SequoiaDB集群的快速部署
查看>>
linux cpu内存利用率获取
查看>>
java install
查看>>
MyBatis学习总结一 —— MyBatis的使用步骤及配置
查看>>
如何构建高性能MySQL索引
查看>>
PDF怎么删除空白页面,你知道用什么方法吗?
查看>>
JavaScript 各种遍历方式详解,有你不知道的黑科技
查看>>
华三模拟器配置DHCP
查看>>
好程序员教程分享关于ajax对象一些常见的问题总结
查看>>
手持终端应用的主要事项
查看>>
ajax的第一天
查看>>
将excel中的数据导入到oracle数据库中
查看>>
SCCM 2012 R2 配置(五)
查看>>
casperjs模拟登录-jd无验证码登录
查看>>
搭建安装oracle数据库
查看>>