问题描述:coins

Silverland的人们使用硬币。他们有价值A1,A2,A3的硬币…一个Silverland美元。有一天Tony打开他的钱箱,发现有一些硬币。他决定在附近的商店买一块非常漂亮的手表。。 他想支付确切的价格(没有变化),他知道价格不会超过m。但他不知道手表的确切价格。

你要编写一个程序,读取n,m,A1,A2,A3 … An和C1,C2,C3 … Cn对应于值为A1,A2,A3 …的Tony的硬币数量 计算托尼可以支付使用这些硬币的价格(1到m)。

题解

我们设f[j]f[j]f[j]表示体积为jjj是否能拼出。

完全背包的可达性问题其实可以转化为一个贪心问题:

  • 加入对于每一个物品iii来说,假设已经知道了前i−1i-1i−1件物品组合出的答案。由于有物品数的限制,我们可以尽量让少的物品组成更多的数,避免无效的浪费。
  • 例如:放f[j]=1f[j]=1f[j]=1时已经组成,就不用浪费这个次数了;否则当f[j−a[i]]=0f[j-a[i]]=0f[j−a[i]]=0且f[j]=1f[j]=1f[j]=1时才选用这个物品。正好对应了上述思想。
  • 至于具体的操作,我们用一个数组use[j]use[j]use[j]表示拼成体积为j时最少需要多少物品iii,和fff的状态转移一样有:use[j]=use[j−a[i]]+1use[j]=use[j-a[i]]+1use[j]=use[j−a[i]]+1.

代码如下:

#include <bits/stdc++.h>using namespace std;
const int N = 200;
const int M = 200000;int n, m, ans;
int f[M], use[M], a[N], c[N];inline int read(void)
{int s = 0, w = 1; char c = getchar();while (c < '0' || c > '9') c = getchar();while (c >= '0' && c <= '9') s = s*10+c-48, c = getchar();return s * w;
}void work(void)
{ans = 0;for (int i=1;i<=n;++i) a[i] = read();for (int i=1;i<=n;++i) c[i] = read();for (int i=1;i<=m;++i) f[i] = 0;f[0] = 1;for (int i=1;i<=n;++i) {for (int j=0;j<=m;++j) use[j] = 0;for (int j=a[i];j<=m;++j)if (f[j] == 0 && f[j-a[i]] == 1 && use[j-a[i]] < c[i])f[j] = 1, use[j] = use[j-a[i]]+1;}for (int i=1;i<=m;++i) ans += f[i];printf("%d\n", ans);n = read(), m = read();return;
}int main(void)
{freopen("coin.in","r",stdin);freopen("coin.out","w",stdout);n = read(), m = read();while (n > 0 && m > 0) work();return 0;
}

题目描述:划分大理石

有价值分别为1…6的大理石各a[1…6]块,现要将它们分成两部分,使得两部分价值之和相等,问是否可以实现。其中大理石的总数不超过20000。

题解

同样做一遍可达性多重背包。

令m=∑a[i]∗i.m=\sum a[i]*i.m=∑a[i]∗i.

如果f[m/2]=1f[m/2]=1f[m/2]=1且mmm为奇数说明可以分成两半。

特别水,因为还可以使用多重背包。

代码如下:

#include <bits/stdc++.h>using namespace std;
const int N = 7;
const int M = 30000;int a[N], f[M], use[M];inline int read(void)
{int s = 0, w = 1; char c = getchar();while (c < '0' || c > '9') c = getchar();while (c >= '0' && c <= '9') s = s*10+c-48, c = getchar();return s * w;
}void work(void)
{int m = 0, flag = 0;for (int i=1;i<=6;++i) a[i] = read(), m += a[i]*i, flag |= a[i];if (flag == 0) exit(0);for (int i=1;i<=m;++i) f[i] = 0;f[0] = 1;for (int i=1;i<=6;++i){for (int j=0;j<=m;++j) use[j] = 0;for (int j=i;j<=m;++j)if (f[j] == 0 && f[j-i] == 1 && use[j-i] < a[i])use[j] = use[j-i]+1, f[j] = 1;}if (m % 2 == 0 && f[m/2] == 1) puts("Can");else puts("Can't");return;
}int main(void)
{freopen("test.in","r",stdin);freopen("test.out","w",stdout);while (1) work();return 0;
}

『多重背包的可达性问题』Coins划分大理石相关推荐

  1. 洛谷P2851 [USACO06DEC]最少的硬币The Fewest Coins(完全背包+多重背包)

    题目描述 Farmer John has gone to town to buy some farm supplies. Being a very efficient man, he always p ...

  2. 【OJ8756】砝码称重V2,可达性多重背包

    砝码称重V2 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 设有1g.2g.3g.5g.10g.20g的砝码各若干枚(其总重<=100,000),要求:计 ...

  3. HDU 2844 Coins 多重背包

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

  4. The Fewest Coins(多重背包+完全背包)

    The Fewest Coins(多重背包+完全背包) Farmer John has gone to town to buy some farm supplies. Being a very eff ...

  5. Coins(多重背包方案可行性dp + 优化)

    Coins 题目 给出硬币面额及每种硬币的个数,求从1到m能凑出面额的个数. 思路 1.朴素的多重背包 题面给出的很明显的多重背包,定义dp为考虑前i种硬币,能凑出j元的方案可行性,可以得到第一版代码 ...

  6. Coins (多重背包)模板题

    模板请看上一篇博客 Whuacmers use coins.They have coins of value A1,A2,A3...An Silverland dollar. One day Hibi ...

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

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

  8. POJ 1742 Coins ( 经典多重部分和问题 DP || 多重背包 )

    题意 : 有 n 种面额的硬币,给出各种面额硬币的数量和和面额数,求最多能搭配出几种不超过 m 的金额? 分析 : 这题可用多重背包来解,但这里不讨论这种做法. 如果之前有接触过背包DP的可以自然想到 ...

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

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

最新文章

  1. 无法启动python怎么办_解决python写的windows服务不能启动的问题
  2. Python机器学习笔记:sklearn库的学习
  3. 如何直接在github上预览html网页效果
  4. helm发布自定义Chart:指定namespace、设置NodePort
  5. 网络编程套接字(三)
  6. java 非法线程_JVM中的线程行为
  7. oracle xtts 测试,XTTS 跨平台表空间迁移测试
  8. android 高德地图动画,点动态样式-基本功能-示例中心-Loca API 示例 | 高德地图API...
  9. 《Spark大数据分析实战》——第2章Spark开发与环境配置
  10. linux-SSH远程服务的管理操作,查看虚拟机信息
  11. C#中String类的几个方法(IndexOf、LastIndexOf、Substring)
  12. Matlab遗传算法工具箱求函数最小值
  13. 永中office linux卸载,永中office Linux版
  14. 安邦拆分的大家保险已具正常经营能力;新东方面向全球招聘3000余人 | 美通企业日报...
  15. Proguard打包混淆报错:can't find superclass or interface
  16. 网站实现QQ登陆功能
  17. WMB Compute 节点访问数据库
  18. php getimagesize svg,getimagesize
  19. 谷歌浏览器windows以及mac系统下设置跨域
  20. 写给喜欢数学和不喜欢数学的朋友们

热门文章

  1. 谷歌搜索引擎更改已访问链接的颜色以增强区分度
  2. 1+X 云计算平台运维与开发认证(初级)B
  3. 2020年中职组 网络空间安全 福建省赛题解析
  4. 安卓P 刘海屏的适配
  5. Windows7 旗舰版原版镜像下载
  6. java加密算法之对称加密算法AES
  7. spark大小表join操作
  8. java计算机毕业设计 高考志愿填报系统 高考志愿推荐系统 高考志愿填报辅助系统 ssm高考填报系统 志愿填报机器人 高考学校实景3D地图(java+ssm+百度地图+实景3D地图)
  9. java+selenium——查找定位元素,elements复数定位(driver.findElementsByClassName(mnav);)002...
  10. 怎样访问远程服务器文件夹,访问远程服务器的共享文件夹