当前位置: 首页 > news >正文

HDU 2844 Coins

像下面代码直接利用二进制求解多重背包会超时

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <vector>
 5 #include <algorithm>
 6 
 7 using namespace std;
 8 
 9 int main(){
10     int n,m;
11     while(cin>>n>>m && n && m){
12         vector<int> A(n),C(n);
13         for(int i = 0 ; i < n; i ++ ) cin >> A[i];
14         for(int i = 0 ; i < n; i ++ ) cin >> C[i];
15         vector<int> coin;
16 
17         for(int i = 0; i < n; i ++ ){
18             int tmp = 1;
19             while(C[i] > tmp){
20                 coin.push_back(tmp*A[i]);
21                 C[i] -= tmp;
22                 tmp <<=1;
23             }
24             coin.push_back(C[i]*A[i]);
25         }
26 
27         vector<int> dp(m+1,0);
28         for(int i = 0 ; i < coin.size(); i ++ ){
29             for(int j = m ; j >= coin[i]; j -- ){
30                 dp[j] = max(dp[j],dp[j-coin[i]] + coin[i]);
31             }
32         }
33 
34         int cnt = 0;
35         for(int i = 1; i <= m ; i++)
36             if(dp[i] != dp[i-1]) cnt++;
37         cout<<cnt<<endl;
38     }
39     return 0;
40 }

参考背包九讲,对多重背包进行优化

 1 #include <iostream>
 2 #include <vector>
 3 #include <algorithm>
 4 #include <cstring>
 5 
 6 #define MAX 100000
 7 using namespace std;
 8 
 9 int dp[MAX];
10 
11 void CompletePack(int val, int m){
12     for(int j = val; j <= m; j ++ )
13         dp[j] = max(dp[j],dp[j - val]+ val);
14 }
15 
16 void ZeroOnePack(int val, int m){
17     for(int j = m; j >= val; j -- )
18         dp[j] = max(dp[j],dp[j - val]+ val);
19 }
20 
21 void MultiplePack(int val,int num, int m){
22     if(val*num >= m ){          //对于固定的m来说,相当于有无限个硬币,
23         CompletePack(val,m); //完全背包
24         return;
25     }
26     int k = 1;               //利用二进制优化转化为01背包
27     while( k < num){
28         ZeroOnePack(k*val,m);
29         num -= k;
30         k <<= 1;
31     }
32     ZeroOnePack(num*val,m);
33 }
34 
35 int main(){
36     int n,m;
37     while(cin>>n>>m && n && m){
38         vector<int> A(n),C(n);
39         for(int i = 0 ; i < n; i ++ ) cin >> A[i];
40         for(int i = 0 ; i < n; i ++ ) cin >> C[i];
41         //vector<int> dp(m+1,0);
42         memset(dp,0,sizeof(dp));
43         for(int i=0; i < n; i ++ )
44             MultiplePack(A[i],C[i],m);
45         int cnt = 0;
46         for(int i = 1; i <= m ; i++)
47             if(dp[i] == i) cnt++;
48         cout<<cnt<<endl;
49     }
50     return 0;
51 }

 

转载于:https://www.cnblogs.com/xiongqiangcs/archive/2013/04/09/3010570.html

相关文章:

  • 上海商业发展研究院刘斌:变革下的供应链发展趋势
  • 刷脸社区来了 阿里云打造无卡化智能社区
  • 中国制造2025 带动机器视觉进入快速车道
  • 【转】Android 中的 Service 全面总结
  • Tomcat配置安全优化
  • MySQL中的explain命令
  • 黑马程序员__用普通类模拟枚举的实现原理
  • 10.3生成器yield\send
  • Web Service中java与.net通信
  • 1050. [HAOI2006]旅行【并查集+枚举】
  • HDU-1421
  • 2251. [2010Beijing Wc]外星联络【后缀数组】
  • Tortoisesvn,鼠标右键菜单中找不到“检出”的处理方法
  • 麻烦大家反馈一下昨天的网站访问速度
  • 网关 Spring-Cloud-Gateway 源码解析 —— 网关初始化
  • [case10]使用RSQL实现端到端的动态查询
  • [译] React v16.8: 含有Hooks的版本
  • Angular4 模板式表单用法以及验证
  • java取消线程实例
  • KMP算法及优化
  • Linux中的硬链接与软链接
  • Markdown 语法简单说明
  • Python - 闭包Closure
  • python 装饰器(一)
  • quasar-framework cnodejs社区
  • Rancher如何对接Ceph-RBD块存储
  • Redux 中间件分析
  • Unix命令
  • 包装类对象
  • - 概述 - 《设计模式(极简c++版)》
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 前嗅ForeSpider采集配置界面介绍
  • 入手阿里云新服务器的部署NODE
  • 推荐一个React的管理后台框架
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • HanLP分词命名实体提取详解
  • 阿里云ACE认证之理解CDN技术
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • ​如何在iOS手机上查看应用日志
  • ​业务双活的数据切换思路设计(下)
  • # Panda3d 碰撞检测系统介绍
  • ###项目技术发展史
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (编译到47%失败)to be deleted
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (七)Java对象在Hibernate持久化层的状态
  • (四)汇编语言——简单程序