Cash Machine (POJ 1276)(多重背包——二进制优化)
题意:给你一个最大金额m,现在有n种类型的纸票,这些纸票的个数各不相同,问能够用这些纸票再不超过m的前提下凑成最大的金额是多少?
题解:写了01背包直接暴力,结果T了,时间复杂度太高了,要跑外循环m和内循环所有的纸票的个数。这个题需要把每种纸票的的个数存的时候转化成2的次幂的形式来存,比如有8个$1,就可以存成1,2,4,1。这样就可以不存放8个1了,如果在个数大的情况下存储的也不会很多,因为转化成这样子,在1~8每一个都可以凑出来,随机搭配,另一方面,如果是8个$2,那么可以存的是2,4,8,2。是2~16之间的偶数都可以凑出来。这是转化成二进制存的好处,具体证明可以自己百度一下。
存的这个地方处理好了之后,剩下的用01背包跑一遍就可以了,我,板子当时记错了QAQ。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll;
const ll maxn = 420000;
ll a[maxn];
ll dp[maxn];
int main()
{
    ll n,m;
    while(~scanf("%lld",&m))
    {
        memset(dp,0,sizeof(dp));
        scanf("%lld",&n);
        ll i,j, x, y, cnt,sum,temp;
        cnt = 0;
        while(n --)
        {
            scanf("%lld %lld",&x,&y);
            temp = sum = 1;
            while(sum <= x)
            {
                a[cnt ++] = temp * y;
                temp *= 2;
                sum += temp;
            }
            if(sum - temp < x)
                a[cnt ++] = (x - (sum - temp)) * y;
        }
        for(i = 0; i < cnt; i ++)
        {
            for(j = m; j >= a[i]; j --)
            {
                dp[j] = max(dp[j],dp[j - a[i]] + a[i]);
            }
        }
        printf("%lld\n",dp[m]);
    }
    return 0;
}
												
											Cash Machine (POJ 1276)(多重背包——二进制优化)的更多相关文章
- Cash Machine POJ - 1276 多重背包二进制优化
		
题意:多重背包模型 n种物品 每个m个 问背包容量下最多拿多少 这里要用二进制优化不然会超时 #include<iostream> #include<cstdio> #in ...
 - Cash Machine POJ 1276 多重背包
		
Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 35387 Accepted: 12816 Description A B ...
 - Dividing POJ - 1014  多重背包二进制优化
		
多重背包模型 写的时候漏了一个等号找了半天 i<<=1 !!!!!! #include<iostream> #include<cstdio> #include&l ...
 - hdu1059 dp(多重背包二进制优化)
		
hdu1059 题意,现在有价值为1.2.3.4.5.6的石头若干块,块数已知,问能否将这些石头分成两堆,且两堆价值相等. 很显然,愚蠢的我一开始并想不到什么多重背包二进制优化```因为我连听都没有听 ...
 - HDOJ(HDU).2844 Coins (DP 多重背包+二进制优化)
		
HDOJ(HDU).2844 Coins (DP 多重背包+二进制优化) 题意分析 先把每种硬币按照二进制拆分好,然后做01背包即可.需要注意的是本题只需要求解可以凑出几种金钱的价格,而不需要输出种数 ...
 - HDOJ(HDU).1059 Dividing(DP 多重背包+二进制优化)
		
HDOJ(HDU).1059 Dividing(DP 多重背包+二进制优化) 题意分析 给出一系列的石头的数量,然后问石头能否被平分成为价值相等的2份.首先可以确定的是如果石头的价值总和为奇数的话,那 ...
 - HDOJ(HDU).2191. 悼念512汶川大地震遇难同胞――珍惜现在,感恩生活 (DP 多重背包+二进制优化)
		
HDOJ(HDU).2191. 悼念512汶川大地震遇难同胞――珍惜现在,感恩生活 (DP 多重背包+二进制优化) 题意分析 首先C表示测试数据的组数,然后给出经费的金额和大米的种类.接着是每袋大米的 ...
 - POJ-1276 Cash Machine 多重背包 二进制优化
		
题目链接:https://cn.vjudge.net/problem/POJ-1276 题意 懒得写了自己去看好了,困了赶紧写完这个回宿舍睡觉,明早还要考试. 思路 多重背包的二进制优化. 思路是将n ...
 - POJ 1014 Dividing(多重背包+二进制优化)
		
http://poj.org/problem?id=1014 题意:6个物品,每个物品都有其价值和数量,判断是否能价值平分. 思路: 多重背包.利用二进制来转化成0-1背包求解. #include&l ...
 
随机推荐
- 微信小程序页面滚动到指定位置
			
页面上有一个元素或者组件,id 为 comment 则: var me = this; var query = wx.createSelectorQuery().in(me); query.selec ...
 - (十五)Hibernate中的多表操作(5):双向多对多
			
Hibernate的双向关联. 对象之间可以相互读取. 双向只针对读取的操作.对于增.删除.改的操作没有任何影响. 案例 : 实现双向多对多 MenuBean.java package ...
 - Java HeapSort
			
Java HeapSort /** * <html> * <body> * <P> Copyright 1994-2018 JasonInternational & ...
 - Django 之一些request封装的常用功能
			
一些常用的request对象属性 介绍 HTTP 应用的信息是通过 请求报文 和 响应报文 传递的,关于更多的相关知识,可以阅读<HTTP权威指南>获得. 其中 请求报文 由客户端发送,其 ...
 - 恺撒密码 B
			
恺撒密码 B  ...
 - Lua 可变参数 ...  的一点测试
			
function test( ... ) if (...) then dibug("has ...") else dibug("no ...") end for ...
 - class类 - extends
			
继承是面向对象中一个比较核心的概念.ES6 class的继承与java的继承大同小异,如果学过java的小伙伴应该很容易理解,都是通过extends关键字继承.相较于ES5当中通过原型链继承要清晰和方 ...
 - form-create教程:移除默认提交按钮
			
本文将介绍form-create如何修改,隐藏默认提交按钮 form-create 是一个可以通过 JSON 生成具有动态渲染.数据收集.验证和提交功能的表单生成器.并且支持生成任何 Vue 组件.结 ...
 - python多线程与多进程异步事件框架
			
多线程简单实现 #!/usr/bin/env python # -*- coding: UTF-8 -*- import logging import queue import threading f ...
 - MySQL全同步复制基于GR集群架构实现(Centos7)
			
目录 一. 理论概述 概述 二. 部署 向组加入新节点 测试 三.总结 一. 理论概述 概述 本案例操作的是针对于MySQL的复制类型中的全同步复制,对几种复制类型简单总结下: 异步复制:MySQL默 ...