【codevs1297】硬币 完全背包
题目大意:给定 N 种不同种类的硬币,每种硬币的重量范围在一个可变区间内,但是价值恒定,求给定一个重量 W,求有多少种面值不同的组合方式。
题解:如果硬币的重量恒定,那么就是一道裸的完全背包问题。因此,可以先将给定的硬币拆分成多个重量不同的硬币。
总的来说,这道题所求的是目标状态有多少种可能的解,而不是最优解,因此有以下两种方式。
解法1:在每个状态中维护一个 \(STL--set\),用来存储到达该状态所有可能的值,最后输出集合的大小即可,常数较大。
解法2:将问题转化为判定性问题,即:额外增加一维用来表示当前可能的价值。
代码 1 如下
#include <bits/stdc++.h>
using namespace std;
int w,n,ans,val[300],cost[300],tot;
set<int> dp[110];
void read_and_parse(){
scanf("%d%d",&w,&n);
for(int i=1,v,mi,mx;i<=n;i++){
scanf("%d%d%d",&v,&mi,&mx);
for(int j=mi;j<=mx;j++)cost[++tot]=j,val[tot]=v;
}
}
void solve(){
dp[0].insert(0);
for(int i=1;i<=tot;i++)
for(int j=cost[i];j<=w;j++)
for(set<int>::iterator p=dp[j-cost[i]].begin();p!=dp[j-cost[i]].end();p++)
dp[j].insert(*p+val[i]);
printf("%d\n",dp[w].size());
}
int main(){
read_and_parse();
solve();
return 0;
}
代码 2 如下
#include <bits/stdc++.h>
using namespace std;
int w,n,ans,val[300],cost[300],tot,dp[110][2510];
void read_and_parse(){
scanf("%d%d",&w,&n);
for(int i=1,v,mi,mx;i<=n;i++){
scanf("%d%d%d",&v,&mi,&mx);
for(int j=mi;j<=mx;j++)cost[++tot]=j,val[tot]=v;
}
}
void solve(){
dp[0][0]=1;
for(int i=1;i<=tot;i++)
for(int j=cost[i];j<=w;j++)
for(int k=val[i];k<=2500;k++)
dp[j][k]|=dp[j-cost[i]][k-val[i]];
for(int i=0;i<=2500;i++)if(dp[w][i])++ans;
printf("%d\n",ans);
}
int main(){
read_and_parse();
solve();
return 0;
}
【codevs1297】硬币 完全背包的更多相关文章
- codevs1297 硬币(背包dp,方案数)
1297 硬币 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 我们知道即使是同一种面值的硬币,它们的重量也有可能不一样, ...
- BZOJ 1042: [HAOI2008]硬币购物( 背包dp + 容斥原理 )
先按完全背包做一次dp, dp(x)表示x元的东西有多少种方案, 然后再容斥一下. ---------------------------------------------------------- ...
- bzoj1708:[Usaco2007 Oct]Money奶牛的硬币(完全背包
1708: [Usaco2007 Oct]Money奶牛的硬币 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 797 Solved: 540[Submi ...
- BZOJ 1042 硬币购物(背包DP+容斥原理)
可以看出这是个多重背包,运用单调队列优化可以使每次询问达到O(s).这样总复杂度为O(s*tot). 会TLE. 因为改题的特殊性,每个硬币的币值是不变的,变的只是每次询问的硬币个数. 我们不妨不考虑 ...
- Luogu P1450 [HAOI2008]硬币购物 背包+容斥原理
考虑如果没有个数的限制,那么就是一个完全背包,所以先跑一个完全背包,求出没有个数限制的方案数即可. 因为有个数的限制,所以容斥一下:没有1个超过限制的方案=至少0个超过限制-至少1个超过限制+至少2个 ...
- 洛谷P1450 [HAOI2008]硬币购物 背包+容斥
无限背包+容斥? 观察数据范围,可重背包无法通过,假设没有数量限制,利用用无限背包 进行预处理,因为实际硬币数有限,考虑减掉多加的部分 如何减?利用容斥原理,减掉不符合第一枚硬币数的,第二枚,依次类推 ...
- [Luogu P1450] [HAOI2008]硬币购物 背包DP+容斥
题面 传送门:https://www.luogu.org/problemnew/show/P1450 Solution 这是一道很有意思的在背包里面做容斥的题目. 首先,我们可以很轻松地想到暴力做背包 ...
- codevs1297 硬币
1297 硬币 题目描述 Description 我们知道即使是同一种面值的硬币,它们的重量也有可能不一样,因为它受到许多因素的影响,包括制造工艺和流程上的.但是任何一种面值的硬币的重量总是处于某 ...
- poj1742硬币——多重背包可行性
题目:http://poj.org/problem?id=1742 贪心地想,1.如果一种面值已经可以被组成,则不再对它更新: 2.对于同一种面值的硬币,尽量用较少硬币(一个)更新,使后面可以用更多此 ...
随机推荐
- libgdx学习记录9——FreeType,ttf中文显示
前面讲到使用Hireo创建的BitmapFont以显示中文字体.这种方式效率很高,当所要显示的字的总数较少,并且大小比较固定时,可以采用这种方式. 但是这种也有弊端: (1)字体大小不能随意设置,当放 ...
- Vue.js动态组件
动态组件: 1.定义: 几个组件放在同一个挂载点下,然后根据父组件的某个变量来决定显示哪个,或者都不显示. 2.动态切换原理: 在挂载点使用<component>标签,然后使用v-bind ...
- effective c++ 笔记 (45-48)
//#45 运用成员函数模版接受所有兼容类型 { /* 1:当你使用智能指针的时候,会发生一个问题,想把一个子类的对象赋给基类的指针变得不可能了, 因为智能指针指定了的是基类的类型,而赋给它的是 ...
- 前端项目模块化的实践1:搭建 NPM 私有仓库管理源码及依赖
以下是关于前端项目模块化的实践,包含以下内容: 搭建 NPM 私有仓库管理源码及依赖: 使用 Webpack 打包基础设施代码: 使用 TypeScript 编写可靠类库 使用 TypeScript ...
- GPT & UEFI Install Windows7
安装介质以FAT或者FAT32分区安装介质添加UEFI支持文件(Windows7及其以前的系统,不支持UEFI启动) 从Windows8的安装文件中提取Bootmgfw.efi文件,重命名为BOOTX ...
- 机器学习英雄访谈录之 DL 实践家:Dominic Monn
目录 机器学习英雄访谈录之 DL 实践家:Dominic Monn 正文 对我的启发 机器学习英雄访谈录之 DL 实践家:Dominic Monn Sanyam Bhutani 是 Medium 上一 ...
- mysql 查询所有子节点的相关数据
定义一个函数 ) CHARSET utf8 BEGIN ); ); SET sTemp = '$'; SET sTempChd =cast(rootId as CHAR); WHILE sTempCh ...
- PAT甲题题解-1068. Find More Coins (30)-dp,01背包
一开始没多想,虽然注意到数据N<=10^4的范围,想PAT的应该不会超时吧,就理所当然地用dfs做了,结果最后一组真的超时了.剪枝啥的还是过不了,就意识到肯定不是用dfs做了.直到看到别人说用0 ...
- java向上转型和向下转型
转型是在继承的基础上而言的,继承是面向对象语言中,代码复用的一种机制,通过继承,子类可以复用父类的功能,如果父类不能满足当前子类的需求,则子类可以重写父类中的方法来加以扩展. 向上转型:子类引用的对象 ...
- VS社区版 使用 OpenCover 获取测试代码覆盖率
注:暂不支持VS2017 Visual Studio 2015 社区版没有集成代码覆盖率的功能,所以想在VS社区版中获取单元测试的代码覆盖率等数据,需要使用到插件 OpenCover. 下载 Open ...