题目大意:给定 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】硬币 完全背包的更多相关文章

  1. codevs1297 硬币(背包dp,方案数)

    1297 硬币  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold   题目描述 Description 我们知道即使是同一种面值的硬币,它们的重量也有可能不一样, ...

  2. BZOJ 1042: [HAOI2008]硬币购物( 背包dp + 容斥原理 )

    先按完全背包做一次dp, dp(x)表示x元的东西有多少种方案, 然后再容斥一下. ---------------------------------------------------------- ...

  3. bzoj1708:[Usaco2007 Oct]Money奶牛的硬币(完全背包

    1708: [Usaco2007 Oct]Money奶牛的硬币 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 797  Solved: 540[Submi ...

  4. BZOJ 1042 硬币购物(背包DP+容斥原理)

    可以看出这是个多重背包,运用单调队列优化可以使每次询问达到O(s).这样总复杂度为O(s*tot). 会TLE. 因为改题的特殊性,每个硬币的币值是不变的,变的只是每次询问的硬币个数. 我们不妨不考虑 ...

  5. Luogu P1450 [HAOI2008]硬币购物 背包+容斥原理

    考虑如果没有个数的限制,那么就是一个完全背包,所以先跑一个完全背包,求出没有个数限制的方案数即可. 因为有个数的限制,所以容斥一下:没有1个超过限制的方案=至少0个超过限制-至少1个超过限制+至少2个 ...

  6. 洛谷P1450 [HAOI2008]硬币购物 背包+容斥

    无限背包+容斥? 观察数据范围,可重背包无法通过,假设没有数量限制,利用用无限背包 进行预处理,因为实际硬币数有限,考虑减掉多加的部分 如何减?利用容斥原理,减掉不符合第一枚硬币数的,第二枚,依次类推 ...

  7. [Luogu P1450] [HAOI2008]硬币购物 背包DP+容斥

    题面 传送门:https://www.luogu.org/problemnew/show/P1450 Solution 这是一道很有意思的在背包里面做容斥的题目. 首先,我们可以很轻松地想到暴力做背包 ...

  8. codevs1297 硬币

    1297 硬币   题目描述 Description 我们知道即使是同一种面值的硬币,它们的重量也有可能不一样,因为它受到许多因素的影响,包括制造工艺和流程上的.但是任何一种面值的硬币的重量总是处于某 ...

  9. poj1742硬币——多重背包可行性

    题目:http://poj.org/problem?id=1742 贪心地想,1.如果一种面值已经可以被组成,则不再对它更新: 2.对于同一种面值的硬币,尽量用较少硬币(一个)更新,使后面可以用更多此 ...

随机推荐

  1. 20155321 《网络攻防》 Exp2 后门原理与实践

    20155321 <网络攻防> Exp2 后门原理与实践 实验内容 例举你能想到的一个后门进入到你系统中的可能方式? 我觉得人们在平时上网的时候可能会无意识地点击到一些恶意的网站,这些网站 ...

  2. 使用Fortify进行代码静态分析(系列文章)

    BUG级别:低 Code Correctness(代码正确性) 1.Class does not Implement Equals(类未能实现Equals方法) Dead Code(死亡代码) 1.U ...

  3. Health Endpoint Monitoring模式

    Health Endpoint Monitoring模式是一种用来监控服务健康状态的模式. Health Endpoint Monitoring模式通过在应用内额外暴露一个可以进行功能检查的接口来实现 ...

  4. mfc CProgressCtrl

    CProgressCtrl常用属性 CProgressCtrl类常用成员函数 CProgressCtrl代码示例 一.CProgressCtrl控件属性 当我们在处理大程序时,常常需要耗很长时间(比如 ...

  5. 【HNOI2018】游戏

    题面 题解 这道题目到底有没有靠谱一点的解法啊... 有很多种\(\color{green}{\mathrm{AC}}\)的方法,设\(L[i],R[i]\)表示点\(i\)最左边和最右边能够到达的位 ...

  6. [CF981F]Round Marriage[二分+霍尔定理]

    题意 洛谷 分析 参考了Icefox 首先二分,然后考虑霍尔定理判断是否有完美匹配.如果是序列的话,因为这里不会出现 \(j<i,L(i)<L(j)\) 或者 \(j<i,R(i)& ...

  7. 有关ADO.NET基础中的基础的熟悉过程

    现在对于ADO.NET基础的理解与记忆并不严谨和完善 所以,只写一点关于自己的理解,嗯,一种去转换思维理解的方法吧,算是吧 希望各位前辈或者同学,积极指出其中的错误和偏差 个人对于刚接触的ADO.NE ...

  8. Java中的Calendar日历用法详解

    第一部分 Calendar介绍 public abstract class Calendar implements Serializable, Cloneable, Comparable<Cal ...

  9. 现代OpenGL渲染管线介绍

    原文摘选自 现代OpenGL渲染管线介绍 此文对最新的OpenGL做一个简单的介绍,如有理解错误,敬请指正.英文原文: https://glumpy.github.io/modern-gl.html ...

  10. 简单的RNN和BP多层网络之间的区别

    先来个简单的多层网络 RNN的原理和出现的原因,解决什么场景的什么问题 关于RNN出现的原因,RNN详细的原理,已经有很多博文讲解的非常棒了. 如下: http://ai.51cto.com/art/ ...