hdu3033---加限制条件的0-1背包
2 #include<stdio.h>
3 #include<string.h>
4 int n,m,k,p[101],max=0,v[101];
5 int br[11][101],sum[11] ;
6 long f[11][10001];
7
8 int main(){
9 int i,j,x,i1;
10 while(scanf("%d%d%d",&n,&m,&k)!=EOF)
11 {
12 memset(sum,0,sizeof(sum));
13 for(i=1;i<=n;i++)
14 {
15 scanf("%d%d%d",&x,&p[i],&v[i]);
16 br[x][++sum[x]]=i;
17 }
18 for(i=1;i<=k;i++)
19 for(j=1;j<=m;j++)
20 f[i][j]=-1;
21 for(j=1;j<=m;j++)
22 f[0][j]=0;
23 for(i=1;i<=k;i++)---------表示品牌编号
24 for(i1=1;i1<=sum[i];i1++)--------表示i品牌下的产品编号
25 for(j=m;j>=1;j--)-------------表示可以花费的钱,注意要倒写
26 {
27 if(j>=p[br[i][i1]])
28 {
29 if(f[i][j-p[br[i][i1]]]!=-1&&f[i][j]<f[i][j-p[br[i][i1]]]+v[br[i][i1]])
30 f[i][j]=f[i][j-p[br[i][i1]]]+v[br[i][i1]];
31 if(f[i-1][j-p[br[i][i1]]]!=-1&&f[i][j]<f[i-1][j-p[br[i][i1]]]+v[br[i][i1]])
32 f[i][j]=f[i-1][j-p[br[i][i1]]]+v[br[i][i1]];
33 }
34 }
35 if(f[k][m]<0)printf("Impossible\n");
36 else
37 printf("%d\n",f[k][m]);
38 }
39 return 0;
40 }
程序思想:f[i][j]代表用j的价钱买前i个品牌可以得到的最大价值数。
赋初值:见18到22行
状态转移:f[i][j]可以经过三种状态得到————
f[i][j],f[i-1][j-p[br[i][i1]]]+v[br[i][i1]],f[i][j-p[br[i][i1]]]+v[br[i][i1]]
br[i][i1]代表第i种品牌的第i1个产品,p[]是某产品的价格,v[]是某产品的价值。
意思是,当放到第i个品牌的第i1个产品时,它的状态等于不放第i1个产品,而放i1
以前的i类品牌中的某些产品(f[i][j]),放i类品牌的第i1个产品,而不放i的其他
产品(f[i-1][j-p[br[i][i1]]]+v[br[i][i1]]),放i类的第i1个产品,同时也放i类中i1以前
的某些产品 (f[i][j-p[br[i][i1]]]+v[br[i][i1]] ) 。
几个问题:
1.如何保证每一类品牌至少放一件产品?
答:首先看循环:
for(i=1;i<=k;i++)
for(i1=1;i1<=sum[i];i1++)
for(j=m;j>=1;j--)
if(j>=p[br[i][i1]])----限制条件
在某一状态存在的情况下(不等于-1),找出三种状态中最大的,赋值给f[i][j] .由于开始时所有f[i][j](i!=0)都为-1,所以i=1
更新时一定会从f[0][]开始,而此时就可保证当i=1时,f[i][j]中所有值不为-1的状态一定装了品牌1的某个物品。而当i>1时,
要想得到最初的f[i][j],一定是从已经放有前i-1个品牌的某个状态得到的,而更新最初的f[i][j] 也一定会用到i品牌的某
个产品(都可由状态转移方程可知)。
总之,保证每一类品牌 至少放一件产品是通过赋初值,条件判断,状态转移三方面实现的。
2.如何抱证每个产品只放一次?
答: 注意循环安排顺序:将对某一品牌产品编号的循环放在对限制总钱数的循环之前 。
转载于:https://www.cnblogs.com/aiyite826/archive/2010/07/23/1783879.html
hdu3033---加限制条件的0-1背包相关推荐
- 动态规划(五)——0/1背包
0/1背包 一.0/1背包问题 1.实例讲解 2.DP求解0/1背包 3.输出0/1背包方案 二.0/1背包题目代码(持续更新) 一.0/1背包问题 给定n种物品和一个背包,物品i的重量为wi,价值为 ...
- 旅行商的背包(二进制优化多重+0/1背包枚举体积))
旅行商的背包(二进制优化多重+0/1背包枚举体积)) 题目描述 小 S 坚信任何问题都可以在多项式时间内解决,于是他准备亲自去当一回旅行商.在出发之前,他购进了一些物品.这些物品共有 n n n 种, ...
- Python 0/1背包、动态规划
参考:http://www.cnblogs.com/fcyworld/p/6243012.html Python 0/1背包.动态规划 0/1背包问题:在能承受一定重量的背包中,放入重量不同,价值不同 ...
- P1417 烹调方案 (0/1背包+贪心)
题目背景 由于你的帮助,火星只遭受了最小的损失.但gw懒得重建家园了,就造了一艘飞船飞向遥远的earth星.不过飞船飞到一半,gw发现了一个很严重的问题:肚子饿了~ gw还是会做饭的,于是拿出了储藏的 ...
- 算法分析与设计——蛮力法0/1背包
蛮力法0/1背包 蛮力法 蛮力法是一种简单直接解决问题的方法,常常直接基于问题的描述,所以蛮力法也是最容易应用的方法. 蛮力法所依赖 的基本技术是遍历,即采用一定的策略依次处理待求解问题的所有元素,从 ...
- 数据结构与算法 / 回溯算法(八皇后、0 - 1 背包)
回溯算法,顾名思义,就是在没有得到最优解的前提下,不断的返回至前面的岔路口位置,重新选择,直至遍历了所有的情况或者得到的预期最优解的情况下再结束. 与贪心算法不同的是,回溯算法理论上是可以得到最优解, ...
- 【例1】 0/1背包《信息学奥赛一本通》【解法一】 02
/* [例1] 0/1背包<信息学奥赛一本通>[解法一] 02 http://ybt.ssoier.cn:8088/problem_show.php?pid=1267 */ #includ ...
- HDOJ 2602-Bone Collector(0/1背包模板、打印方案及滚动数组解法)
0/1背包 一.Bone Collector 解法一:二维数组解法(0/1背包模板代码) 1.1 0/1背包打印方案代码 解法二:滚动数组(一维)解法 2.1 一维滚动数组例题 E-爱玩游戏的Tom ...
- HDU1248 寒冰王座【0/1背包+DP】
寒冰王座 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- 为什么abc三相电压加起来是0,而坐标变换之后在dq0坐标系中有值呢?——矢量控制中abc到dq0坐标系的坐标变换的思考
在电机控制.电力电子逆变电路和PQ控制中都会用到坐标变换,在学习电机控制时,感觉对坐标变换比较熟悉了. 但当运用在电力电子逆变电路和PQ控制的坐标变换时,又迷惑了. 为什么abc三相电压加起来是0,而 ...
最新文章
- route命令相关整理
- XIV Open Cup named after E.V. Pankratiev. GP of Europe
- php采用fpdf生成中文pdf
- Keil进入仿真,窗口不显示程序运行箭头
- Kali Linux GRUB修复
- Java私有构造函数不能阻止继承
- BeanFactory与FactoryBean的区别
- Python+selenium第一个自动化脚本
- 聚类分析在用户行为中的实例_用户关注行为数据分析过程详解-描述统计+聚类...
- 如何在windows下安装Python(Python入门教程)
- GitHub:攻击者正在利用被盗 OAuth 令牌攻击数十家组织机构
- 除了富二代 据说这9种人最有富豪潜质
- itex将html转成pdf加水印,Springboot 中集成itextpdf HTML转PDF并添加水印(支持中文)
- [JSON]2017年最新县及县以上行政区划代码
- SwiftUI Core ML 基础教程
- python 贴吧小爬虫案例
- yolov5-4.0转caffe记录
- SOJ4480 Easy Problem IV (并查集)
- bat 自定义位数随机密码生成器
- 我开发了一款软件,完成了舔狗的绝地反杀(代码开源)!
热门文章
- 简单的WINFORM窗体,体验WINFORM带来的快感
- 我的Go语言学习之旅一:WIN下Go的安装
- SAwUML – UML-based, contractual software architectures and their formal analysis using SPIN
- 集群、负载均衡、分布式
- FFT-Matlab初步实现
- 20135302魏静静——linux课程第六周实验及总结
- MySQL中int(5) 中的5代表什么意思?
- PHP 显示本机的外网IP
- oracle-bone,Oracle Bone Inscriptions / 甲骨文
- python字符串title函数_python字符串内建函数-capitalize、title、upper