UVA 10306 e-Coins(全然背包: 二维限制条件)
UVA 10306 e-Coins(全然背包: 二维限制条件)
题意:
对于每一个例子。先给定两个数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(全然背包: 二维限制条件)的更多相关文章
- UVA 10465 Homer Simpson(全然背包: 二维目标条件)
UVA 10465 Homer Simpson(全然背包: 二维目标条件) http://uva.onlinejudge.org/index.php? option=com_onlinejudge&a ...
- HDU 2159 FATE(全然背包+二维费用背包)
FATE Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- uva 10306 - e-Coins(完全背包)
题目链接:10306 - e-Coins 题目大意:给出m和s, 再给出m种电子硬币,每种硬币有两种金额xi,yi.现在要在m种硬币种选若干个硬币,可以重复选同一种硬币, 使得(x1 + x2 + . ...
- UVA 562 Dividing coins --01背包的变形
01背包的变形. 先算出硬币面值的总和,然后此题变成求背包容量为V=sum/2时,能装的最多的硬币,然后将剩余的面值和它相减取一个绝对值就是最小的差值. 代码: #include <iostre ...
- UVA 562 Dividing coins (01背包)
//平分硬币问题 //对sum/2进行01背包,sum-2*dp[sum/2] #include <iostream> #include <cstring> #include ...
- HDU 2159 FATE(二维全然背包)
中文题目就不用解释了 就是裸的二维全然背包 d[i][j]表示消耗i忍耐杀j个怪最多可获得的经验 然后就用全然背包来做了 二维背包背包只是是多了一重循环 <span style=&quo ...
- HDU2159 二维完全背包
FATE Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- DP:Cow Exhibition(POJ 2184)(二维问题转01背包)
牛的展览会 题目大意:Bessie要选一些牛参加展览,这些牛有两个属性,funness和smartness,现在要你求出怎么选,可以使所有牛的smartness和funness的最大,并且这两 ...
- hdu3496 二维01背包
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=3496 //刚看题目以为是简单的二维01背包,but,,有WA点.. 思路:题中说,只能买M ...
随机推荐
- 【Appium】每次启动是提示安装setting和unlock app的解决办法
进入appium安装目录,C:\Program Files (x86)\Appium\node_modules\appium\lib\devices\android,编辑android.js文件,注释 ...
- 洛谷 P3902 递增
P3902 递增 题目描述 现有数列A_1,A_2,\cdots,A_NA1,A2,⋯,AN,修改最少的数字,使得数列严格单调递增. 输入输出格式 输入格式: 第1 行,1 个整数N 第2 行, ...
- ArcGIS api for javascript——查询,然后单击显示信息窗口
描述 本例展示如何配置查询任务为示例的工作流程: 1.用户单击一个要素来加亮显示. 2.用户再一次单击要素来查看属性信息的 InfoWindow. 本例查询USA州,因此ESRI_StateCityH ...
- 3D打印技术之切片引擎(6)
[此系列文章基于熔融沉积( fused depostion modeling, FDM )成形工艺] 这一篇文章说一下填充算法中的网格填充.网格填充在现有的较为成熟的引擎中是非常普遍的:skeinfo ...
- uvalive 6669 hidden tree(好壮压dp)
题目见option=com_onlinejudge&Itemid=8&page=show_problem&problem=4681">here 题意:给一个序列 ...
- Linux 下UVC&V4L2技术简单介绍(二)
通过前文Linux 下UVC&V4L2技术简单介绍(一)我们了解了UVC和V4L2的简单知识. 这里是USB设备的文档描写叙述:http://www.usb.org/developers/do ...
- Beta分布从入门到精通
近期一直有点小忙,可是不知道在瞎忙什么,最终有时间把Beta分布的整理弄完. 以下的内容.夹杂着英文和中文,呵呵- Beta Distribution Beta Distribution Defini ...
- 1.windows(64位)下使用curl命令
转自:https://www.cnblogs.com/xing901022/p/4652624.html Curl命令可以通过命令行的方式,执行Http请求.在Elasticsearch中有使用的场景 ...
- BZOJ 1103 DFS序+线段树
思路: 先搞出来DFS序 进入这个点 +1 出这个点 -1 线段树维护前缀和 (因为还要修改) 搞定 修改的时候只修改底下节点就OK了 (边权–>点权 不多说) //By SiriusRen # ...
- 自动与因特网时间服务器同步 NTP 服务器 pool.ntp.org, 120.24.166.46 端口 123
自动与因特网时间服务器同步 NTP 服务器 pool.ntp.org 海康提供的NTP服务器 120.24.166.46 端口 123