Buns---cf 106C(多重背包)
2016-03-10 13:47
495 查看
题目链接:http://codeforces.com/problemset/problem/106/C
题意:有n克面粉,m种馅料,然后每种馅料有ai克,bi克馅料和ci克面粉做的面包可以买di元,也可以不放馅料,那么c0克面粉做的面包可以卖d0元,求最多可以赚多少钱;
不放馅料,那么c0克面粉做的面包可以卖d0元,这句话可以认为是物品的个数不限(即ai/bi很大)的一种物品;
ai克馅料最多只能做ai/bi个面包,所以可以转化为总费用为 n ,有m+1个物品,每个物品的个数是ai/bi,每个的价值是 di ,花费是 ci,求最大价值;
View Code
题意:有n克面粉,m种馅料,然后每种馅料有ai克,bi克馅料和ci克面粉做的面包可以买di元,也可以不放馅料,那么c0克面粉做的面包可以卖d0元,求最多可以赚多少钱;
不放馅料,那么c0克面粉做的面包可以卖d0元,这句话可以认为是物品的个数不限(即ai/bi很大)的一种物品;
ai克馅料最多只能做ai/bi个面包,所以可以转化为总费用为 n ,有m+1个物品,每个物品的个数是ai/bi,每个的价值是 di ,花费是 ci,求最大价值;
#include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> #include <map> using namespace std; #define met(a, b) memset(a, b, sizeof(a)) #define INF 0x3f3f3f3f #define N 210 int n, m, c , d , a , b , dp [N*N]; int main() { while(scanf("%d %d %d %d", &n, &m, &c[1], &d[1])!=EOF) { met(dp, 0); a[1] = 11000; b[1] = 1; for(int i=2; i<=m+1; i++) { scanf("%d %d %d %d", &a[i], &b[i], &c[i], &d[i]); } for(int i=1; i<=m+1; i++) { for(int k=0; k<=a[i]/b[i]; k++) { for(int j=n; j>=k*c[i]; j--) { dp[i][j] = max(dp[i][j], dp[i-1][j-k*c[i]]+k*d[i]); } } } printf("%d\n", dp[m+1] ); } return 0; }
View Code
相关文章推荐
- 【掌上齐齐哈尔】市民网上换领驾驶证方便快捷
- Picasso设置超时时间和加载出错时的图片
- c#中datagridview对选中的多行进行批量删除的代码示例
- android应用九宫格图案锁
- maven安装配置
- Java基础之多线程(二)
- redis3.0 centos6.5 集群安装 遇到的问题
- 排列组合算法
- CDOJ 1284 苦恼的郭大侠 map启发式合并
- 集成 Tomcat 插件到 Eclipse 的过程
- iOS中延时执行的几种方式的比较和汇总
- DUILIB项目中自定义快捷键功能的实现方法
- ios编译错误解决方案整理
- POJ-3278-Catch That Cow
- mac下vi语法高亮
- WebPack系列教程(十二):示例
- java写入文件(文件内容末尾追加)
- Sublime Text 2/3 安装Package Control
- MongoDB@入门一
- open live writer