UVA 10306 e-Coins(全然背包: 二维限制条件)
UVA 10306 e-Coins(全然背包: 二维限制条件)
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1247
题意:
对于每一个例子。先给定两个数n,m,分别表示有n种硬币,对于每一种硬币有两个价值。分别记做x,y,题目要求从中选择一些硬币,使得满足m*m=X*X+Y*Y, 当中X是选出的硬币的全部x价值的和。Y是全部选出的硬币的y价值的和。硬币有无数多个。如今要求的是,满足上述要求使用的最少的硬币数
分析:
硬币数量无限,这就是显然的全然背包问题. 做这类问题首先要搞清楚什么是限制条件, 什么是目标条件?
本题的限制条件是: x价值与y价值.(它们值共同构成了限制值m)
本题的目标条件是: 使得所选硬币最少.
一般的全然背包状态设计都是用 dp[i][j]==x 表示当决策完前i个物品后, 限制条件正好==j时(或者不超过j时), 能得到的目标条件最优(可能要求最小或最大).
本来我是想用m作为j这维度的限制条件的,可是发现假设用m作为一维限制条件,那么你无法依据当前的m值和你当前选的物品来推出你上一次决策前的m’值. 所以本题须要用x和y两维限制条件来做. (事实上就是加了个维度,没什么本质的变化)
状态设计: dp[k][i][j]==num 表示决策完前k种硬币后, 当前全部硬币的x价值和为i , 当前全部硬币的y价值和为j 时所须要的最少硬币数目为num.(由x价值和与 y价值和我们确定唯一的 m )
状态转移:
dp[k][i][j] = min( dp[k-1][i][j] , dp[k][i-x[k]][j-y[k]])
怎样理解上述的状态转移方程呢?
首先来看dp[k][i][j], 它表示用前k中硬币构成 x价值和为i , y价值和为j 的方法数目. 那么:
1. 假设我们根本不用第k种硬币(仅仅用前k-1种硬币就可以),我们能够知道有dp[k-1][i][j]种方式能够(不用不论什么一个第k种硬币)构成x价值和为i , y价值和为j 的状态.
2. 假设我们至少用1个第k种硬币来构成目标状态, 那么我们能够知道有dp[k][i-x[k]][j-y[k]] 种方法能达成目的.
综上所述, dp[k][i][j] = min( dp[k-1][i][j] ,dp[k][i-x[k]][j-y[k]] )
初值为dp[0][0][0]=0 , 其它为INF(无穷大).
终于我们所求为 全部的dp[n][i][j]中满足 i*i+j*j==m*m 的最小值.
程序实现用的滚动数组, 所以dp仅仅有[i][j]这两个维度.
AC代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define INF 1e8
const int maxn=300+5;int n,m;//n为货币种数,m为须要达到的价值
int x[maxn],y[maxn];//相应每种货币的两个属性值
int dp[maxn][maxn];int main()
{int T;scanf("%d",&T);while(T--){//读输入+初始化scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)scanf("%d%d",&x[i],&y[i]);for(int i=0;i<maxn;i++)for(int j=0;j<maxn;j++)dp[i][j]=INF;dp[0][0]=0;//递推求解int ans=INF;for(int k=1;k<=n;k++)for(int i=x[k];i<maxn;i++)for(int j=y[k];j<maxn;j++){dp[i][j] = min(dp[i][j], dp[i-x[k]][j-y[k]]+1);if(i*i+j*j==m*m) //这里假设加了 k==n 就WA 想想为什么?
ans=min(ans, dp[i][j]); } //输出 if(ans==INF) printf("not possible\n"); else printf("%d\n",ans); } return 0; }
UVA 10306 e-Coins(全然背包: 二维限制条件)相关推荐
- [01背包] 宠物小精灵之收服(01背包+二维费用背包+思维)
文章目录 0. 前言 1. 01背包裸题 0. 前言 相关: [背包] 背包问题算法模板(模板) 1. 01背包裸题 1022. 宠物小精灵之收服 每个精灵仅被收服一次,故可以考虑 01 背包,是典型 ...
- 背包(二维数组版和一维数组版)
一:前言 这是动态规划的经典题型,那么我们也是 按照动态规划五步走的策略分析的 确定dp数组的含义以及下标的含义 确定dp数组的递推公式 确定dp数组的初始化 确定dp数组的遍历顺序 举例验证(如果不 ...
- nssl1317-灵魂分流药剂【分组背包,二维费用背包】
正题 题目大意 一个二维费用的分组背包 NoNoNo解题思路 codecodecode #include<cstdio> #include<algorithm> using n ...
- 【python】一篇讲透背包问题(01背包 完全背包 多重背包 二维费用背包)
面对背包问题,有一个很重要的方程式:状态转移方程式 所以每一种背包问题我都会给出状态转移方程式 #01背包 什么是01背包型问题? 先给大家感受一下01背包型问题: 给定n种物品和一背包.物品i的重量 ...
- UVA 10306 e-Coins (二维背包)
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...
- UVA 10306 e-Coins(二维完全背包)
题意: 有n种物品,每种物品有两种价值x和y,并且每种物品的个数不限,求(x1 + x2 + -)^2 + (y1 + y2 + -) ^2 == S ^ 2 思路: 因为每种物品任意个,所以是二维完 ...
- 背包问题(恰好背满 二维背包) 总结
专题训练:点击打开链接 密码:JXFEACM 他人总结:点击打开链接 背包九讲:点击打开链接 其实核心记住: 背包是组合问题 填充性质 元素之间没关系 1. 01背包(右->左) 恰好装满( ...
- 背包模型dp2之二维费用背包
二维费用背包 状态表示:f[i][j][k]所有只从前i个物体中选,并且总体积不超过j,总重量不超过k的选法状态表示:f[i][j][k]所有只从前i个物体中选,并且总体积不超过j,总重量不超过k的选 ...
- HDU 2159 FATE【二维完全背包】
题目链接:https://vjudge.net/problem/HDU-2159 FATE ...
最新文章
- Open vSwitch相关字段详解之L4:TCP, UDP, SCTP
- 自由自在珍珠奶茶 喝出缤纷夏季
- 【网址收藏】win10环境下安装Docker、Windows安装docker
- php数据库操作命令精华大全
- 【转】VS2013动态库文件的创建及其使用详解
- 大数据平台基本功能有哪些
- ORACLE HANDBOOK系列之五:PL/SQL中的集合类型(Collections in PL/SQL)
- lisp语言画地物符号_地形图中的地物符号说明汇总
- uniapp使用阿里百川SDK唤醒淘宝APP 打开淘宝领券页面/渠道备案,uniapp对接淘宝联盟等等超级详细
- mysql8.0.17 汉化
- 04 可视化开发工具
- 解决chrome/IE浏览器被桔梗导航劫持的问题
- 家庭账本应该怎样记简洁明了
- python画大对勾_多种方法告诉你!Word如何在方框中打对勾√和叉叉×
- 绿之韵人民日报聚焦:加强企业管理,慢工才能出细活
- 用Scrapy框架爬取豆瓣电影,构建豆瓣电影预测评分模型
- 查看Mysql 数据库所有表的数据量
- crh寄存器_寄存器-相关博客帖子 - 电子工程世界-论坛
- 采用Tagged Pointer的字符串
- FastAdmin自定义批量操作
热门文章
- 数据可视化教程来了!
- Datawhale厦门大学分享记录!
- 保姆级NLP学习路线来啦!
- SQL_Case When 嵌套
- GitHub:数据科学最全资料集合
- Fast-SCNN的解释以及使用Tensorflow 2.0的实现
- 推荐一位我的好朋友,8年码农,前鹅厂工程师!
- 潘石屹首次Python考试成绩 99 分,失分点:画完图后忘了隐藏画笔的箭头
- 封禁华为的美国,现在不得不在5G标准制定上“恢复合作”,网友:5G真香
- 吴恩达机器学习入门 2018 高清视频公开,还有习题解答和课程拓展,网友:找不到理由不学!...