杭店 ACM 1864 最大报销额 01背包
 
![勾选C++才能过 
题意: 
    先规定可以报销一定额度的发票,物品类型有A,B,C,三种。要求每张发票总额不得超过1000元,单项物品不得超过600.求报销的最大额 
分析: 
先找到合格的发票,然后再挑选总额最大的几张发票(01背包来解决)
如何找出合格发票? 
1.发票中只有ABC着三种物品 
2.单张发票的额度<=1000. 
3.一张发票中,单项物品总额<=600
题目中的价钱都是浮点数,01背包只能处理整数,怎么办? 
题目给的数据最多两位数(题目没说保留几位小数),所以我们可以把数据都*100,等用01背包的方法计算完后,再强值转换成浮点数。
01背包? 
扩展: 
有N种物品(每种物品只有一个)和一个容量为V的背包。第i件物品的占用空间是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。
基本思路 : 
每种物品仅有一件,只有两种选择:放或不放。 用子问题定义状态:即dp[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。则其状态转移方程便是:dp[i][j] =  max(dp[i-1][j], dp[i-1][j - w[i]] + v[i])
code: 
for(int i = 1; i <= n; i++)  
    { 
        for(int j = 0; j <= W; j++) 
        { 
            if(j < w[i])    dp[i][j]  = dp[i-1][j]; 
            else dp[i][j] =  max(dp[i-1][j], dp[i-1][j - w[i]] + v[i]); 
        } 
    } 
本题: 
将每一张发票当作是一种物品,同样只有两种选择:要或不要,总额度相当于背包容量 
注意确保数组够大,1000*100*35
#include<stdio.h>
#include<string.h>
#define max(a,b) (a>b)?a:b
int dp[3500000],N[35];
int main()
{
    int cot,Val,A,B,C,n,i,j,k,flag;
    double val,price;
    while(scanf("%lf %d",&val,&cot)!=EOF&&cot)
    {
         k=0;
        char ABC;
        memset(dp,0,sizeof(dp));
        Val=(int)(val*100);
        while(cot--)
        {
            scanf("%d",&n);
            A=0;
            B=0;
            C=0;
            flag=1;
            while(n--)
            {
                scanf(" %c:%lf",&ABC,&price);
                j=(int)(price*100);
                if(ABC=='A')
                    A+=j;
                else if(ABC=='B')
                    B+=j;
                else if(ABC=='C')
                    C+=j;
                else
                {
                    flag=0;
                }
            }
                if(flag&&A<=60000&&B<=60000&&C<=60000&&A+B+C<=100000)
                {
                    N[k++]=A+B+C;
                }
            }
            for(i=0;i<k;i++)
                for(j=Val;j>=N[i];j--)
                {
                    dp[j]=max(dp[j],dp[j-N[i]]+N[i]);
                }
                printf("%.2lf\n",(double)dp[Val]/100.0);
    }
}杭店 ACM 1864 最大报销额 01背包的更多相关文章
- HDU 1864 最大报销额 0-1背包
		HDU 1864 最大报销额 0-1背包 题意 现有一笔经费可以报销一定额度的发票.允许报销的发票类型包括买图书(A类).文具(B类).差旅(C类),要求每张发票的总额不得超过1000元,每张发票上, ... 
- HDOJ 1864 最大报销额(01背包)
		http://acm.hdu.edu.cn/showproblem.php?pid=1864 最大报销额 Time Limit: 1000/1000 MS (Java/Others) Memor ... 
- HDU -1864最大报销额(01背包)
		这道题属于简单的01背包,但是背包问题还算简单,就是前面的细节处理的时候要注意,题意大致说了三条限制吧 1. 只有a, b, c 三种类型的发票可以报销,其它的一律不报销 2. 物品单项的报销额不超过 ... 
- hdu 1864 最大报销额 01背包
		Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s) ... 
- HDU 1864 最大报销额(01背包,烂题)
		题意:被坑惨,单项不能超过600,其实是一张发票上A类/B类/C类的总和分别不能超过600. 思路:此题的数据很烂.用贪心也能过,用01背包也可以.都测试不出到底那些是错的. #include < ... 
- HDU 1864最大报销额    01背包问题
		B - 最大报销额 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit St ... 
- 九度OJ 1025 最大报销额(01背包)
		题目1025:最大报销额 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2683 解决:608 题目描述: 现有一笔经费可以报销一定额度的发票.允许报销的发票类型包括买图书(A类).文具( ... 
- hdu1864最大报销额(01背包)
		http://acm.sdut.edu.cn:8080/vjudge/contest/view.action?cid=187#problem/G 该题要注意的就是每张单子A种类的总和不能大与600,同 ... 
- HDU - 1864 最大报销额 (背包)
		题意: 现有一笔经费可以报销一定额度的发票.允许报销的发票类型包括买图书(A类).文具(B类).差旅(C类),要求每张发票的总额不得超过1000元,每张发票上,单项物品的价值不得超过600元.现请你编 ... 
随机推荐
- 第五周学习总结-HTML5
			2018年8月12日 暑假第五周,我把HTML剩余的一些标签和用法看完了并学了一些HTML5的标签及用法. HTML5比HTML多了一些元素,也删去了一些元素. HTML5新增元素 图形元素 < ... 
- String 类的实现(1)浅拷贝存在的问题以及深拷贝实现
			1. 浅拷贝 : 也称位拷贝 , 编译器只是直接将指针的值拷贝过来, 结果多个对象共用 同 一块内存, 当一个对象将这块内 存释放掉之后, 另 一些对象不知道该块空间已经还给了系统, 以为还有效, ... 
- Flask-WTF中的csrf保护
			CSRF 保护 这部分文档介绍了 CSRF 保护. 为什么需要 CSRF? Flask-WTF 表单保护你免受 CSRF 威胁,你不需要有任何担心.尽管如此,如果你有不包含表单的视图,那么它们仍需要保 ... 
- 一脸懵逼学习Storm的搭建--(一个开源的分布式实时计算系统)
			Storm的官方网址:http://storm.apache.org/index.html :集群部署的基本流程(基本套路): 集群部署的流程:下载安装包.解压安装包.修改配置文件.分发安装包.启动集 ... 
- IPMI无法执行命令
			IPMI无法执行命令 https://www.cnblogs.com/EricDing/p/8995263.html http://www.cnblogs.com/heidsoft/p/4014301 ... 
- Java 集合Collection与List的详解
			1.什么是集合 存储对象的容器,面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,存储对象,集合是存储对象最常用的一种方式. 集合的出现就是为了持有对象.集合中可以存储任意类型的 ... 
- golang ffmpeg 做网络直播
			最近在公司做在线视频转码的工作,研究了下ffmpeg 最后直接研究了下网络直播,我是在我自己的mac 上面测试的,效果,还可以,先看看效果图吧 ffmpeg 我是通过brew安装 的,这步就略了 VL ... 
- luogu 1471
			题意: 蒟蒻HansBug在一本数学书里面发现了一个神奇的数列,包含N个实数.他想算算这个数列的平均数和方差. 操作1:1 x y k ,表示将第x到第y项每项加上k,k为一实数. 操作2:2 x y ... 
- plt实现动态画图
			用pycharm跑的没有出现动态线条的话: 1.点击setting,输入关键字Scien...搜索出Python Scientific, 在右侧去掉对勾(默认是勾选的),然后右下角Apply--OK, ... 
- Codeforces 1076F Summer Practice Report dp
			Summer Practice Report dp[ i ][ 0 ]表示放完前 i 页, 第 i 页最后一段是 0, 0个数的最小值. dp[ i ][ 1 ]表示放完前 i 页, 第 i 页最后一 ... 
