【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.对于同一种面值的硬币,尽量用较少硬币(一个)更新,使后面可以用更多此 ...
随机推荐
- 20155333 《网络对抗》 Exp9 Web安全基础
20155333 <网络对抗> Exp9 Web安全基础 基础问题回答 1.SQL注入攻击原理,如何防御? 原理: 通过在用户名.密码登输入框中输入一些',--,#等特殊字符,实现引号闭合 ...
- WPF应用
代码 private void button1_Click(object sender, RoutedEventArgs e) { calculate sa = new calculate(int.P ...
- vue-cli 使用 font-awesome 字体插件
在 cmd 中,运行:cnpm install font-awesome在 main.js 里添加import "font-awesome/css/font-awesome.css" ...
- 小程序echarts数据不改变,或者是一次渲染成功,第二次进入,渲染失败的解决办法
1.引入echarts插件: import * as echarts from '../../ec-canvas/echarts'; 2.data中定义: ecBar: { onInit: initC ...
- mfc CListCtrl 报表格式
知识点: CListCtrl报表格式 CListCtrl报表格式添加列 CListCtrl报表格式添加行 CListCtrl报表格式设置单元格 一.CListCtrl报表格式 类名:SysListVi ...
- flaskr 报错及其修改
作者:hhh5460 官网有一个flaskr的例子,按照其8个步骤(包括测试),一步一步照着做,有3个地方报错. 究其原因,可能是flaskr这个例子年代比较久远,而现在python以及flask都有 ...
- Kubernetes学习之路(二十一)之网络模型和网络策略
目录 Kubernetes的网络模型和网络策略 1.Kubernetes网络模型和CNI插件 1.1.Docker网络模型 1.2.Kubernetes网络模型 1.3.Flannel网络插件 1.4 ...
- django请求的生命周期
1. 概述 首先我们知道HTTP请求及服务端响应中传输的所有数据都是字符串. 在Django中,当我们访问一个的url时,会通过路由匹配进入相应的html网页中. Django的请求生命周期是指当用户 ...
- 通过IP来判断所在城市
1 今天的讲解什么? 如何根据ip查询出所在城市?我把博客园中收集的教程整理了一下,主要结合调用相关API,或者通过纯真数据库来解决这个问题. 2 相关介绍 2.1 这个是什么? 通过IP查询所在城 ...
- unity小地图制作___按比例尺图标布局
1. 2.这里小地图显示的范围为整个空间区域,而不是单独的相机渲染区域 3. 4. 5. using System.Collections; using System.Collections.Gene ...