HDU - 2844 Coins(多重背包)
2015-09-24 21:18
399 查看
题目大意:给出N中硬币的价值和数量,问[1-m]有几个数能用硬币组成
解题思路:多重背包裸题
解题思路:多重背包裸题
[code]#include <cstdio> #include <cstring> const int M = 100010; const int N = 110; bool vis[M]; int val , num ; int n, m; void ZeroOnePack(int w) { for (int i = m; i >= w; i--) if (vis[i - w]) vis[i] = true; } void CompletePack(int w) { for (int i = w; i <= m; i++) if (vis[i - w]) vis[i] = true; } void solve() { memset(vis, 0, sizeof(vis)); vis[0] = true; for (int i = 0; i < n; i++) { if (num[i] * val[i] >= m) CompletePack(val[i]); else { int t = 1; while (t <= num[i]) { ZeroOnePack(val[i] * t); num[i] -= t; t *= 2; } ZeroOnePack(val[i] * num[i]); } } int ans = 0; for (int i = 1; i <= m; i++) if (vis[i]) ans++; printf("%d\n", ans); } void init() { for (int i = 0; i < n; i++) scanf("%d", &val[i]); for (int i = 0; i < n; i++) scanf("%d", &num[i]); } int main() { while (scanf("%d%d", &n, &m) != EOF && n + m) { init(); solve(); } return 0; }
相关文章推荐
- 测试用例知识,总结边界值,因果图,等价类划分法
- 备忘----android环境搭建
- linux常用命令 和shell脚本(必知)
- 关于Java中多个数据excel表格的导出
- 3、下载与安装Eclipse
- java实现链表的反转
- HDU 1238 Substrings(求公共正反向连续子串)
- Scala教程(十)函数与闭包详解
- Java中Collection和Collections的区别
- VS2010/MFC编程之树型控件的创建及CTreeCtrl类的成员函数和实例
- IOS开发基础知识--碎片22
- 3、下载与安装Eclipse
- [转]Android ListView最佳处理方式,ListView拖动防重复数据显示,单击响应子控件
- HDU - 3496 Watch The Movie(01背包)
- 二级指针的申请跟删除(基于C++的new机制)
- HttpClient使用详解
- [转]Android学习笔记:TabHost 和 FragmentTabHost
- 【Android】loadData与loadDataWithBaseURL的区别
- [sicily]1157. The hardest problem
- CF 579A (二进制拆分)