Problem - 2844

题目大意:有n种硬币,每种有不同的价值vi以及数量cnti,问这些硬币能组合出多少种金额

1<=n<=100;1<=m<=1e5;1<=vi<=1e5;1<=cnti<=1000

思路:多重背包问题,dp[i][j]表示表示前i种硬币能否拼成金额j,能为1,不能为0,第一种情况用前i-1种硬币能拼出来的,前i种也是能得,所以如果dp[i-1][j]=1,那么dp[i][j]也等于1,第二种情况,i相等时,如果当前已经得到金额j-vi,且当前硬币还有剩余,则dp[j]=1,即如果dp[j-v[i]]=1,则dp[j]=1,所以我们用一个num数组统计当前种类硬币已选取的数量,然后如果当前位置没有转移过且我们转移过来了,就令答案+1

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N = 1e5 + 5;
bool dp[N];
int v[105], num[N], cnt[105];
int main()
{int n, m;while (~scanf_s("%d%d", &n, &m) , (n && m)){int ans = 0;for (int i = 1; i <= n; i++){scanf_s("%d", &v[i]);//每种硬币的价值}for (int i = 1; i <= n; i++){scanf_s("%d", &cnt[i]);//每种硬币的数量}for (int i = 1; i <= m; i++){dp[i] = 0;//判断能否组成金额i}dp[0] = 1;for (int i = 1; i <= n; i++){for (int i = 1; i <= m; i++){num[i] = 0;//每种硬币当前已用的次数}for (int j = v[i]; j <= m; j++){if (!dp[j] && dp[j - v[i]] && num[j - v[i]] < cnt[i]){//当前金额没有转移过,j-vi可以组成,当前硬币选择的次数小于数量dp[j] = 1;num[j] = num[j - v[i]] + 1;ans++;//成功转移,答案+}}}printf("%d\n", ans);}return 0;
}

二进制拆分解法:将每个硬币的数量拆成2的幂,然后转化为01背包问题,从而减少物品的总数,令dp[i]表示价值为i的硬币拼成的最大金额,因为硬币的价格和重量相等,所以当价值为i的硬币拼成的最大价值也是i时,才说明能凑成当前金额,即dp[i]=i时的金额i符合要求

//#include <__msvc_all_public_headers.hpp>
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+5;
int n, m;
int dp[N];
int w[N], num[N];
int main()
{cin.tie(0);cout.tie(0);ios::sync_with_stdio(false);while (cin>>n>>m , (n && m)){for (int i = 1; i <= m; i++){dp[i] = 0;//dp[i]表示总价值为i的硬币能组成的最大价值}for (int i = 0; i < n; i++){cin >> w[i];}for (int i = 0; i < n; i++){cin >> num[i];}dp[0] = 0;//没硬币时没有价值for (int i = 0; i < n; i++){if (w[i] * num[i] > m){//当前硬币价值*数量超过了背包容量,变成完全背包问题for (int j = w[i]; j <= m; j++)//正推求最大价值dp[j] = max(dp[j], dp[j - w[i]] + w[i]);//硬币的价值和重量是相等的}else{for (int k = 1; num[i] > 0; k*=2){//二进制拆分int x = min(k, num[i]);//当前分出的硬币数for (int j = m; j >= w[i] * x; j--){//01背包倒推dp[j] = max(dp[j], dp[j - w[i] * x]+w[i]*x);}num[i] -= x;}}}int sum = 0;for (int i = 1; i <= m; i++){if (dp[i]==i)//如果价值为i的硬币拼出的最大价值等于i,则说明能凑成isum += 1;}cout << sum << endl;}return 0;
}

Coins hdu2844相关推荐

  1. hdu-2844 Coins (混合背包+二进制优化)

    HDU链接 文章目录 题目描述: 题意: 题解 (代码) 题目描述: 输入描述: 输出描述: For each test case output the answer on a single line ...

  2. hdu2844 Coins(普通的多重背包 + 二进制优化)

    看完背包九讲的多重背包之后,这题目应该可以轻松做出来了 模型: 有N种物品和一个容量为V的背包.第i种物品最多有n[i]件可用,每件费用是c[i],价值是w[i].求解将哪些物品装入背包可使这些物品的 ...

  3. LeetCode刷题记录5——441. Arranging Coins(easy)

    LeetCode刷题记录5--441. Arranging Coins(easy) 目录 LeetCode刷题记录5--441. Arranging Coins(easy) 题目 语言 思路 后记 题 ...

  4. PAT甲级1048 Find Coins :[C++题解]哈希表、两个硬币之和为定值

    文章目录 题目分析 题目链接 题目分析 来源:acwing 题意:找两个数,和为定值. 分析:本题在各大OJ上几乎都有, 反正在Leetcode上做过.本题有两种常见的解法,一种是双指针,另一种是用哈 ...

  5. PAT甲级1068 Find More Coins (30 分):[C++题解]DP、背包问题、dp输出方案

    文章目录 题目分析 题目链接 题目分析 来源:acwing 分析:m是背包容量,a1,a2,....,ana_1,a_2,....,a_na1​,a2​,....,an​是n个物品,第i个物品的体积是 ...

  6. 北邮OJ 2016 网预-Square Coins

    时间限制 1000 ms 内存限制 65536 KB 题目描述 Artoria, also known as Saber-chan, was born into a time of chaos and ...

  7. HDOJ 1398 Square Coins

    母函数"第一季",无压力AC~ View Code 1 //#include <fstream> 2 #include <iostream> 3 using ...

  8. 【PAT甲级】1048 Find Coins (25 分) C++ 全部AC

    题目 给你一个sum,以及拥有的钱 让你找出一个组合,正好用两张钱付清sum,注意如果有多个结果,输出其中最小的 这道题注意稍微优化一下算法,要不然卡在测试点3,4 我是用二重循环过了的,只要注意输入 ...

  9. 【最简解法】1048 Find Coins (25 分)_18行代码AC

    立志用最少的代码做最高效的表达 PAT甲级最优题解-->传送门 Eva loves to collect coins from all over the universe, including ...

最新文章

  1. 截屏没有了_原来华为手机的截屏方法不止3种,用了这么久,现在才知道新玩法?...
  2. linux应用程序是什么,linux下c开发了一个应用程序,它的扩展名是什么?
  3. dz论坛php.ini设置,Discuz!X1.5至3.2论坛Win主机与Linux主机伪静态设置方法
  4. LIB和DLL的区别与使用
  5. python模拟登录获取Cookie
  6. parentNode,parentElement,offsetParent
  7. Java携带HTTP头信息下载网络图片
  8. DZ X页头主菜单背景图片透明自由更换页头背景图片的方法
  9. 找寻比QQ和新浪UC更先进的视频聊天软件
  10. 新xp系统无法连接网络连接服务器,WinXP系统本地连接受限制或无连接怎么办?...
  11. 利用代码自动逛店铺拿喵币
  12. 星淘惠跨境—从火爆现象中抓住商机是卖家应该具备的思维
  13. 2022-12- 05 网工进阶(三十七)MPLS--基本概念、转发过程、基本配置、配置静态LSR
  14. java界面的面板重绘
  15. 华为服务器查看阵列信息,查看服务器磁盘阵列
  16. 百度识图上线,体验以图搜图
  17. 腰肌劳损患者自我保健方法
  18. 随机森林实战(分类任务+特征重要性+回归任务)(含Python代码详解)
  19. WPF 入门教程Grid使用技巧
  20. 面向对象:编程范式、类、对象

热门文章

  1. 网络优化工程师的工资到底靠谱吗
  2. 科研人员必贴春联,总有一款适合你!
  3. openssl 生成自签证书及查看证书细节
  4. Arch Linux 指南 02——安装图形界面
  5. 全国计算机比赛第一名可以保送吗,她是中国奥数第一名,已保送清华大学姚班,为何国际奥数成绩却垫底?...
  6. css--animate
  7. 互联网晚报 | 8月14日 星期六 | 爱奇艺发全员信宣布抵制职场潜规则;比亚迪唐EV挪威首车交付;阿迪达斯25亿美元出售锐步...
  8. 2017淘宝天猫年货节套福娃玩法攻略
  9. 用心去追寻自己的选择,自己的所爱
  10. 华为折叠手机是鸿蒙系统吗,华为MateX折叠屏5G手机即将面世,你们期待鸿蒙系统吗?...