代码

1 #include<stdlib.h>
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背包相关推荐

  1. 动态规划(五)——0/1背包

    0/1背包 一.0/1背包问题 1.实例讲解 2.DP求解0/1背包 3.输出0/1背包方案 二.0/1背包题目代码(持续更新) 一.0/1背包问题 给定n种物品和一个背包,物品i的重量为wi,价值为 ...

  2. 旅行商的背包(二进制优化多重+0/1背包枚举体积))

    旅行商的背包(二进制优化多重+0/1背包枚举体积)) 题目描述 小 S 坚信任何问题都可以在多项式时间内解决,于是他准备亲自去当一回旅行商.在出发之前,他购进了一些物品.这些物品共有 n n n 种, ...

  3. Python 0/1背包、动态规划

    参考:http://www.cnblogs.com/fcyworld/p/6243012.html Python 0/1背包.动态规划 0/1背包问题:在能承受一定重量的背包中,放入重量不同,价值不同 ...

  4. P1417 烹调方案 (0/1背包+贪心)

    题目背景 由于你的帮助,火星只遭受了最小的损失.但gw懒得重建家园了,就造了一艘飞船飞向遥远的earth星.不过飞船飞到一半,gw发现了一个很严重的问题:肚子饿了~ gw还是会做饭的,于是拿出了储藏的 ...

  5. 算法分析与设计——蛮力法0/1背包

    蛮力法0/1背包 蛮力法 蛮力法是一种简单直接解决问题的方法,常常直接基于问题的描述,所以蛮力法也是最容易应用的方法. 蛮力法所依赖 的基本技术是遍历,即采用一定的策略依次处理待求解问题的所有元素,从 ...

  6. 数据结构与算法 / 回溯算法(八皇后、0 - 1 背包)

    回溯算法,顾名思义,就是在没有得到最优解的前提下,不断的返回至前面的岔路口位置,重新选择,直至遍历了所有的情况或者得到的预期最优解的情况下再结束. 与贪心算法不同的是,回溯算法理论上是可以得到最优解, ...

  7. 【例1】 0/1背包《信息学奥赛一本通》【解法一】 02

    /* [例1] 0/1背包<信息学奥赛一本通>[解法一] 02 http://ybt.ssoier.cn:8088/problem_show.php?pid=1267 */ #includ ...

  8. HDOJ 2602-Bone Collector(0/1背包模板、打印方案及滚动数组解法)

    0/1背包 一.Bone Collector 解法一:二维数组解法(0/1背包模板代码) 1.1 0/1背包打印方案代码 解法二:滚动数组(一维)解法 2.1 一维滚动数组例题 E-爱玩游戏的Tom ...

  9. HDU1248 寒冰王座【0/1背包+DP】

    寒冰王座 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  10. 为什么abc三相电压加起来是0,而坐标变换之后在dq0坐标系中有值呢?——矢量控制中abc到dq0坐标系的坐标变换的思考

    在电机控制.电力电子逆变电路和PQ控制中都会用到坐标变换,在学习电机控制时,感觉对坐标变换比较熟悉了. 但当运用在电力电子逆变电路和PQ控制的坐标变换时,又迷惑了. 为什么abc三相电压加起来是0,而 ...

最新文章

  1. route命令相关整理
  2. XIV Open Cup named after E.V. Pankratiev. GP of Europe
  3. php采用fpdf生成中文pdf
  4. Keil进入仿真,窗口不显示程序运行箭头
  5. Kali Linux GRUB修复
  6. Java私有构造函数不能阻止继承
  7. BeanFactory与FactoryBean的区别
  8. Python+selenium第一个自动化脚本
  9. 聚类分析在用户行为中的实例_用户关注行为数据分析过程详解-描述统计+聚类...
  10. 如何在windows下安装Python(Python入门教程)
  11. GitHub:攻击者正在利用被盗 OAuth 令牌攻击数十家组织机构
  12. 除了富二代 据说这9种人最有富豪潜质
  13. itex将html转成pdf加水印,Springboot 中集成itextpdf HTML转PDF并添加水印(支持中文)
  14. [JSON]2017年最新县及县以上行政区划代码
  15. SwiftUI Core ML 基础教程
  16. python 贴吧小爬虫案例
  17. yolov5-4.0转caffe记录
  18. SOJ4480 Easy Problem IV (并查集)
  19. bat 自定义位数随机密码生成器
  20. 我开发了一款软件,完成了舔狗的绝地反杀(代码开源)!

热门文章

  1. 简单的WINFORM窗体,体验WINFORM带来的快感
  2. 我的Go语言学习之旅一:WIN下Go的安装
  3. SAwUML – UML-based, contractual software architectures and their formal analysis using SPIN
  4. 集群、负载均衡、分布式
  5. FFT-Matlab初步实现
  6. 20135302魏静静——linux课程第六周实验及总结
  7. MySQL中int(5) 中的5代表什么意思?
  8. PHP 显示本机的外网IP
  9. oracle-bone,Oracle Bone Inscriptions / 甲骨文
  10. python字符串title函数_python字符串内建函数-capitalize、title、upper