HDUOJ 2844 Coins

题目链接

Problem Description

Whuacmers use coins.They have coins of value A1,A2,A3…An Silverland dollar. One day Hibix opened purse and found there were some coins. He decided to buy a very nice watch in a nearby shop. He wanted to pay the exact price(without change) and he known the price would not more than m.But he didn’t know the exact price of the watch.

You are to write a program which reads n,m,A1,A2,A3…An and C1,C2,C3…Cn corresponding to the number of Tony’s coins of value A1,A2,A3…An then calculate how many prices(form 1 to m) Tony can pay use these coins.

Input

The input contains several test cases. The first line of each test case contains two integers n(1 ≤ n ≤ 100),m(m ≤ 100000).The second line contains 2n integers, denoting A1,A2,A3…An,C1,C2,C3…Cn (1 ≤ Ai ≤ 100000,1 ≤ Ci ≤ 1000). The last test case is followed by two zeros.

Output

For each test case output the answer on a single line.

Sample Input

3 10
1 2 4 2 1 1
2 5
1 4 2 1
0 0

Sample Output

8
4

典型的多重背包,但是题目卡了时间,也即如果将多重背包直接转为 01 背包会超时,所以此时要考虑背包的二进制优化,一般的 01 背包我们对物品的数量 n n n,必须要开出一样大的数组,但是通过二进制转化, n = 2 a 1 + 2 a 2 + ⋯ + 2 a k n=2^{a_1}+2^{a_2}+\cdots+2^{a_k} n=2a1​+2a2​+⋯+2ak​,就可以将 n n n 的存储空间离散成 k k k 个,从而大大减少空间和时间的开销,打个比方:

27=2^4+2^3+2^1+2^0 -> 27位的空间只需5位空间即可存储

通过优化我们只需将权值分散到每一个二进制位即可,AC代码如下:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int num[110],c[110],v[10005],dp[100005];
int main(){int n,m;while(~scanf("%d%d",&n,&m)&&(n||m)){int cnt=0,ans=0;for(int i=0;i<n;i++) scanf("%d",&c[i]);for(int i=0;i<n;i++){scanf("%d",&num[i]);for(int j=1;num[i]>0;j*=2){int x=min(num[i],j);v[cnt++]=x*c[i];num[i]-=x;}}memset(dp,0,sizeof(dp));dp[0]=1;for(int i=0;i<cnt;i++){for(int j=m;j>=v[i];j--){if(dp[j-v[i]]) dp[j]=1;}}for(int i=1;i<=m;i++) if(dp[i]) ans++;printf("%d\n",ans);}
}

HDUOJ 2844 Coins相关推荐

  1. HDU 2844 Coins 多重背包

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2844 Coins Time Limit: 2000/1000 MS (Java/Others)Mem ...

  2. HDU - 2844 Coins(多重背包+完全背包)

    题意 给n个币的价值和其数量,问能组合成\(1-m\)中多少个不同的值. 分析 对\(c[i]*a[i]>=m\)的币,相当于完全背包:\(c[i]*a[i]<m\)的币则是多重背包,考虑 ...

  3. HDU 2844 Coins (多重背包)

    题目链接 题意:Tony想要买一个东西,他只有n种硬币,每种硬币的面值为a[i],每种硬币的数量为c[i],要买的物品价值不超过m,输出1-m中有多少种价格Tony可以用硬币组合出来. 题解:多重背包 ...

  4. 动态规划总结与题目分类

    源博客链接:http://blog.csdn.net/cc_again/article/details/25866971 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间效率高,代码量少 ...

  5. 『ACM-算法-动态规划』初识DP动态规划算法

    一.多阶段决策过程的最优化问题 在现实生活中,有类活 动的过程,由于 它的特殊性,可将过程分成若干个互相阶段.在它的每一阶段都需要作出决策,从而使整个过程达到最好的活动效果.当阶段决策的选取不是任意确 ...

  6. (转)dp动态规划分类详解

    dp动态规划分类详解 转自:http://blog.csdn.NET/cc_again/article/details/25866971 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间 ...

  7. 个人DP训练(基础版)

    题目链接    hdu 2955 Robberies 01背包,转化为求被抓的概率. 题目链接       hdu   1864  最大报销额 01背包,每张发票的总额为容量和价值,注意预处理数据,对 ...

  8. 动态规划题目——背包

    背包问题 1. 01背包 [HDOJ 2955.Robberies] [HDOJ 1203.I NEED A OFFER!] [HDOJ 1864.最大报销额] 2. 完全背包 [HDOJ 2159. ...

  9. 《动态规划》— 动态规划分类

    动态规划(英语:Dynamic programming,DP)是一种在数学.计算机科学和经济学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法. 动态规划常常适用于有重叠子问题和最 ...

最新文章

  1. SYNCHRO 4D可视化调度学习教程 SYNCHRO 4D: Visual Scheduling
  2. 第k大 or 第k小 or 中位数
  3. python打包_cx_freeze
  4. Makefile —— 如何在文件内使用变量?
  5. python调用摄像头转向_教你如何利用python调用摄像头
  6. 用python绘制图形_python绘制图形
  7. 移动硬盘提示无法访问使用驱动器中的光盘之前需要格式化,里面的数据怎么恢复...
  8. docker jenkins 公钥_搭建 Jenkins 与 GitLab 的持续集成环境
  9. 第十七届全国大学生智能车竞赛航天智慧物流获奖证书
  10. Wireshark抓包详细分析
  11. 在unity打开c#脚本写代码没有Unity相关提示
  12. overflow:auto自动滚动到底部(vue)
  13. 这样设置定时消息通知提醒,重要的信息肯定不会错过
  14. 计算机学院心理节活动主题,计算机学院举行心理健康教育主题团体活动
  15. 鸡兔同笼,有35个头,94只脚,求鸡兔各几只
  16. ip中继对接_FreePBX配置IP对接中继
  17. final可以修饰些什么
  18. 华工计算机科学与技术专业评级,华南理工高考专业分数排名,计算机分数遥遥领先,双一流专业垫底...
  19. Windows10 UEFI+GPT模式(解决更新显示UEFI布局问题)
  20. 软考——程序设计语言概述

热门文章

  1. iPhone销售不佳,苹果进退失据
  2. 维基解密网站下线4小时,与《41号修订案》有关?
  3. OA协同办公系统  印章管理
  4. 计算机老师新年贺卡祝福语,新年贺卡祝老师祝福语精选
  5. 哆啦A梦?不好记!安利一下Prometheus这款开源的企业监控报警平台
  6. doraemon的python 集合
  7. 沪江 AOP 切片 API使用说明
  8. CAM350导入rou文件
  9. 王传福以350亿元登顶中国首富
  10. 如何让Citrix客户端不能访问XenApp服务器的磁盘