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(全然背包: 二维限制条件)相关推荐

  1. [01背包] 宠物小精灵之收服(01背包+二维费用背包+思维)

    文章目录 0. 前言 1. 01背包裸题 0. 前言 相关: [背包] 背包问题算法模板(模板) 1. 01背包裸题 1022. 宠物小精灵之收服 每个精灵仅被收服一次,故可以考虑 01 背包,是典型 ...

  2. 背包(二维数组版和一维数组版)

    一:前言 这是动态规划的经典题型,那么我们也是 按照动态规划五步走的策略分析的 确定dp数组的含义以及下标的含义 确定dp数组的递推公式 确定dp数组的初始化 确定dp数组的遍历顺序 举例验证(如果不 ...

  3. nssl1317-灵魂分流药剂【分组背包,二维费用背包】

    正题 题目大意 一个二维费用的分组背包 NoNoNo解题思路 codecodecode #include<cstdio> #include<algorithm> using n ...

  4. 【python】一篇讲透背包问题(01背包 完全背包 多重背包 二维费用背包)

    面对背包问题,有一个很重要的方程式:状态转移方程式 所以每一种背包问题我都会给出状态转移方程式 #01背包 什么是01背包型问题? 先给大家感受一下01背包型问题: 给定n种物品和一背包.物品i的重量 ...

  5. UVA 10306 e-Coins (二维背包)

    题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...

  6. UVA 10306 e-Coins(二维完全背包)

    题意: 有n种物品,每种物品有两种价值x和y,并且每种物品的个数不限,求(x1 + x2 + -)^2 + (y1 + y2 + -) ^2 == S ^ 2 思路: 因为每种物品任意个,所以是二维完 ...

  7. 背包问题(恰好背满 二维背包) 总结

    专题训练:点击打开链接  密码:JXFEACM 他人总结:点击打开链接  背包九讲:点击打开链接 其实核心记住: 背包是组合问题 填充性质 元素之间没关系 1. 01背包(右->左) 恰好装满( ...

  8. 背包模型dp2之二维费用背包

    二维费用背包 状态表示:f[i][j][k]所有只从前i个物体中选,并且总体积不超过j,总重量不超过k的选法状态表示:f[i][j][k]所有只从前i个物体中选,并且总体积不超过j,总重量不超过k的选 ...

  9. HDU 2159 FATE【二维完全背包】

    题目链接:https://vjudge.net/problem/HDU-2159 FATE                                                       ...

最新文章

  1. Open vSwitch相关字段详解之L4:TCP, UDP, SCTP
  2. 自由自在珍珠奶茶 喝出缤纷夏季
  3. 【网址收藏】win10环境下安装Docker、Windows安装docker
  4. php数据库操作命令精华大全
  5. 【转】VS2013动态库文件的创建及其使用详解
  6. 大数据平台基本功能有哪些
  7. ORACLE HANDBOOK系列之五:PL/SQL中的集合类型(Collections in PL/SQL)
  8. lisp语言画地物符号_地形图中的地物符号说明汇总
  9. uniapp使用阿里百川SDK唤醒淘宝APP 打开淘宝领券页面/渠道备案,uniapp对接淘宝联盟等等超级详细
  10. mysql8.0.17 汉化
  11. 04 可视化开发工具
  12. 解决chrome/IE浏览器被桔梗导航劫持的问题
  13. 家庭账本应该怎样记简洁明了
  14. python画大对勾_多种方法告诉你!Word如何在方框中打对勾√和叉叉×
  15. 绿之韵人民日报聚焦:加强企业管理,慢工才能出细活
  16. 用Scrapy框架爬取豆瓣电影,构建豆瓣电影预测评分模型
  17. 查看Mysql 数据库所有表的数据量
  18. crh寄存器_寄存器-相关博客帖子 - 电子工程世界-论坛
  19. 采用Tagged Pointer的字符串
  20. FastAdmin自定义批量操作

热门文章

  1. 数据可视化教程来了!
  2. Datawhale厦门大学分享记录!
  3. 保姆级NLP学习路线来啦!
  4. SQL_Case When 嵌套
  5. GitHub:数据科学最全资料集合
  6. Fast-SCNN的解释以及使用Tensorflow 2.0的实现
  7. 推荐一位我的好朋友,8年码农,前鹅厂工程师!
  8. 潘石屹首次Python考试成绩 99 分,失分点:画完图后忘了隐藏画笔的箭头
  9. 封禁华为的美国,现在不得不在5G标准制定上“恢复合作”,网友:5G真香
  10. 吴恩达机器学习入门 2018 高清视频公开,还有习题解答和课程拓展,网友:找不到理由不学!...