博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj 2642 The Brick Stops Here(01背包)
阅读量:4072 次
发布时间:2019-05-25

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

题目链接:

题目大意:

黄铜砖是由铜和锌两种元素组成的,每一块黄铜砖中1000克,铜占其中的1~999克之间。铜占比重不同的黄铜砖是属于不同类的。有N个黄铜砖,给出它们的铜占的重量以及价格。

现在有c个客户,每个可以要买Mi个不同类的黄铜砖,要求把Mi个黄铜砖融化后,铜站的比率为每千克在  【CMin,CMax】克之间。

问每个客户最少花多少钱可以满足要求?

分析:

  f[i][j][k], 代表在前i个砖中,买j个砖,重量为小于等于k的情况下,所花的最少价钱。
  状态转移:  f[i][j][k] = min(f[i][j][k], f[i-1][j][k],  f[i-1][j-1][k-cost[i]]+val[i])
  但是三维耗费空间太大,所以要压缩空间变成二维的
  根据背包九讲,在递推时,变成逆序的即可。

代码:

#include
#include
#include
#include
#include
#define MP make_pair#define SQ(x) ((x)*(x))using namespace std;typedef long long int64;const double PI = acos(-1.0);const int MAXN = 210;const int INF = 0x3f3f3f3f;int n, m, copper[MAXN], price[MAXN];int M[MAXN], CMin[MAXN], CMax[MAXN];int f[22][20010];int main(){ while(~scanf("%d", &n)){ for(int i=0; i
max_M) max_M=M[i]; if(CMax[i]*M[i] > max_weight) max_weight = CMax[i]*M[i]; } memset(f, INF, sizeof(f)); f[0][0] = 0; for(int i=0; i
=1; --j){ for(int v=max_weight; v>=copper[i]; --v){ f[j][v] = min(f[j][v], f[j-1][v-copper[i]]+price[i]); } } } for(int i=0; i

转载地址:http://opzni.baihongyu.com/

你可能感兴趣的文章
postgresql减少wal日志生成量的方法
查看>>
swift中单例的创建及销毁
查看>>
获取App Store中App的ipa包
查看>>
iOS 关于pods-frameworks.sh:permission denied报错的解决
查看>>
设置RGBColor
查看>>
设置tabbaritem的title的颜色及按钮图片
查看>>
动态设置label的高度
查看>>
获取 一个文件 在沙盒Library/Caches/ 目录下的路径
查看>>
图片压缩
查看>>
检测缓存文件是否超时
查看>>
十进制字符串转十六进制字符串
查看>>
属性字符串(富文本)的使用
查看>>
cell上label的背景颜色在选中状态下改变的解决办法
查看>>
GPS定位
查看>>
地图、显示用户位置、大头针
查看>>
自定义大头针
查看>>
UIButton添加block点击事件
查看>>
利用runtime给类别添加属性
查看>>
本地推送
查看>>
FMDB的使用
查看>>