UVA 10306 e-Coins(全然背包: 二维限制条件)

option=com_onlinejudge&Itemid=8&page=show_problem&problem=1247">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. UVA 10465 Homer Simpson(全然背包: 二维目标条件)

    UVA 10465 Homer Simpson(全然背包: 二维目标条件) http://uva.onlinejudge.org/index.php? option=com_onlinejudge&a ...

  2. HDU 2159 FATE(全然背包+二维费用背包)

    FATE Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  3. uva 10306 - e-Coins(完全背包)

    题目链接:10306 - e-Coins 题目大意:给出m和s, 再给出m种电子硬币,每种硬币有两种金额xi,yi.现在要在m种硬币种选若干个硬币,可以重复选同一种硬币, 使得(x1 + x2 + . ...

  4. UVA 562 Dividing coins --01背包的变形

    01背包的变形. 先算出硬币面值的总和,然后此题变成求背包容量为V=sum/2时,能装的最多的硬币,然后将剩余的面值和它相减取一个绝对值就是最小的差值. 代码: #include <iostre ...

  5. UVA 562 Dividing coins (01背包)

    //平分硬币问题 //对sum/2进行01背包,sum-2*dp[sum/2] #include <iostream> #include <cstring> #include ...

  6. HDU 2159 FATE(二维全然背包)

    中文题目就不用解释了   就是裸的二维全然背包 d[i][j]表示消耗i忍耐杀j个怪最多可获得的经验  然后就用全然背包来做了  二维背包背包只是是多了一重循环 <span style=&quo ...

  7. HDU2159 二维完全背包

    FATE Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  8. DP:Cow Exhibition(POJ 2184)(二维问题转01背包)

        牛的展览会 题目大意:Bessie要选一些牛参加展览,这些牛有两个属性,funness和smartness,现在要你求出怎么选,可以使所有牛的smartness和funness的最大,并且这两 ...

  9. hdu3496 二维01背包

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=3496 //刚看题目以为是简单的二维01背包,but,,有WA点.. 思路:题中说,只能买M ...

随机推荐

  1. Linux 下安装 redis 详情

    一:将redis 压缩包上传到 Linux  usr/local下 (一):在local 下创建一个 redis 目录 (二):上传redis压缩包到此目录下. 二:Linux 进入 local目录下 ...

  2. 题解 HDU1565 【方格取数(1)】

    给你一个n*n的格子的棋盘,每个格子里面有一个非负数. 从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取的数所在的2个格子不能相邻,并且取出的数的和最大. 题目清晰明了,这道题应该用 ...

  3. Android如何从外部跳进App

    博客出自:http://blog.csdn.net/liuxian13183,转载注明出处! All Rights Reserved ! 这个问题解决了两天时间,因为网上没有完整的解决方案,解决后分享 ...

  4. ArcSDE学习笔记--------增、删、改、查操作

    建立连接 package org.lq.ssm.gp.controller; import com.esri.sde.sdk.client.SeConnection; import com.esri. ...

  5. hdu-1342 Lotto

    http://acm.hdu.edu.cn/showproblem.php? pid=1342 题意:以升序的形式给定k个数.输出从中挑选6个数满足升序的全部情况. 思路:两个參数.第一个保存当前搜索 ...

  6. Option可选值(一)

    //: Playground - noun: a place where people can play import Cocoa class Person { var residence: Resi ...

  7. linux命令su与su-的差别

    su命令和su -命令最大的本质差别就是: su仅仅是切换了root身份.但Shell环境仍然是普通用户的Shell. 而su -连用户和Shell环境一起切换成root身份了. 仅仅有切换了Shel ...

  8. Trie树的常见应用大总结(面试+附代码实现)

    (一)Trie的简单介绍 Trie树,又称字典树,单词查找树或者前缀树.是一种用于高速检索的多叉树结构,如英文字母的字典树是一个26叉树.数字的字典树是一个10叉树. 他的核心思想是空间换时间,空间消 ...

  9. swift具体解释之八---------------下标脚本

    swift具体解释之八-----下标脚本 下标脚本 能够定义在类(Class).结构体(structure)和枚举(enumeration)这些目标中.能够觉得是訪问对象.集合或序列的快捷方式.不须要 ...

  10. vim基础学习之EX命令

    :tabnew -创建新标签 :split(sp)-垂直分割窗口 如果没有打开新的文件,那么会打开原来窗口的文件 :vsplit(vsp)-水平分割窗口 如果没有打开新的文件,那么会打开原来窗口的文件 ...