$POJ1742\ Coins$ 多重背包+贪心
$Sol$
首先发现这是一个多重背包,所以可以用多重背包的一般解法(直接拆分法,二进制拆分法...)
但事实是会TLE,只能另寻出路
本题仅关注“可行性”(面值能否拼成)而不是“最优性”,这是一个特殊之处。
从这里找优化
在“最优性”的问题中,$f[j]$从$f[j]$或$f[j-a[i]]$中转移而来;而在这样的“可行性”问题中,其实只要$f[j]$可行,我们就可以不用考虑$f[j-a[i]$了,也可以反过来说。
于是我们可以考虑一种贪心策略,设$used[j]$表示$f[j]$在阶段$i$时为$True$至少要用多少枚第$i$中硬币。
$f[j]$优先考虑由$f[j]$转移而来,而不是$f[j-a[i]]$,这样就尽量减少了第$i$种硬币的使用数量。
其实还可以在作一个小优化,就是直接把$used[j]$的值存在$f[j]$中,$f[]$初始为$-1$,意为不能表示。
$Code$
#include<iostream>
#include<cstdio>
#define Rg register
#define il inline
#define db double
#define ll long long
#define go(i,a,b) for(Rg int i=a;i<=b;i++)
#define yes(i,a,b) for(Rg int i=a;i>=b;i--)
using namespace std;
il int read()
{
int x=,y=;char c=getchar();
while(c<''||c>''){if(c=='-')y=-;c=getchar();}
while(c>=''&&c<=''){x=(x<<)+(x<<)+c-'';c=getchar();}
return x*y;
}
const int N=;
int n,m,a[N],c[N],f[];
ll ans;
il void sol()
{
go(i,,m)f[i]=-;
go(i,,n)
go(j,,m)
{
if(f[j]>=)f[j]=c[i];//f[0]=c[i]可以看成是初始化
else if(j>=a[i]&&f[j-a[i]]>)f[j]=f[j-a[i]]-;//第i种硬币还有剩余
}
go(i,,m)if(f[i]>=)ans++;
}
int main()
{
while()
{
n=read(),m=read();ans=;
if(!n&&!m)break;
go(i,,n)a[i]=read();go(i,,n)c[i]=read();
sol();printf("%lld\n",ans);
}
return ;
}
$POJ1742\ Coins$ 多重背包+贪心的更多相关文章
- POJ1742 Coins[多重背包可行性]
Coins Time Limit: 3000MS Memory Limit: 30000K Total Submissions: 34814 Accepted: 11828 Descripti ...
- POJ1742:Coins(多重背包)
Description People in Silverland use coins.They have coins of value A1,A2,A3...An Silverland dollar. ...
- POJ 3260 The Fewest Coins(多重背包+全然背包)
POJ 3260 The Fewest Coins(多重背包+全然背包) http://poj.org/problem?id=3260 题意: John要去买价值为m的商品. 如今的货币系统有n种货币 ...
- HDU-2844 Coins(多重背包)
Problem Description Whuacmers use coins.They have coins of value A1,A2,A3...An Silverland dollar. On ...
- POJ3260——The Fewest Coins(多重背包+完全背包)
The Fewest Coins DescriptionFarmer John has gone to town to buy some farm supplies. Being a very eff ...
- POJ 1742 Coins(多重背包, 单调队列)
Description People in Silverland use coins.They have coins of value A1,A2,A3...An Silverland dollar. ...
- HDU2844 Coins 多重背包
Coins Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- Codeforces 755 F. PolandBall and Gifts 多重背包+贪心
F. PolandBall and Gifts It's Christmas time! PolandBall and his friends will be giving themselves ...
- HDu -2844 Coins多重背包
这道题是典型的多重背包的题目,也是最基础的多重背包的题目 题目大意:给定n和m, 其中n为有多少中钱币, m为背包的容量,让你求出在1 - m 之间有多少种价钱的组合,由于这道题价值和重量相等,所以就 ...
随机推荐
- 选用适合的ORACLE优化器
ORACLE的优化器共有3种: a. RULE (基于规则) b. COST (基于成本) c. CHOOSE (选择性) 设置缺省的优化器,可以通过对init.ora文件中OPTIMIZER ...
- 可运行的js代码
canrun <html> <head> <title>测试博客园HTML源码运行程序</title> <meta http-equiv=&quo ...
- pip 将 某包指定到某目录 安装
pip 将 某包指定到某目录 安装: pip install --target=d:\somewhere\other\than\the\default package_name
- SpringMVC参数校验,包括JavaBean和基本类型的校验
该示例项目使用SpringBoot,添加web和aop依赖. SpringMVC最常用的校验是对一个javaBean的校验,默认使用hibernate-validator校验框架.而网上对校验单个参数 ...
- supersocket Silverlight 策略服务器
<?xml version="1.0"?> <configuration> <configSections> <section name= ...
- yii框架不输出头文件和尾文件
控制器: public function actionCat(){ return $this->renderPartial('cat');} 在进行页面输出渲染的时候. 1.render 输出父 ...
- [转]关于/r与/n 以及 /r/n 的区别总结
应该说还是区别的,\r就是回到行首,\n就是到下一行的,但是一般我们输出程序时,看不到明显的差别的 '\r'是回车,'\n'是换行,前者使光标到行首,后者使光标下移一格.通常用的Enter是两个加起来 ...
- 在Vue 中调用数据出现属性不存在的问题
这已经是我在调用数据时趟过几次的坑了,索性记录下来防止后面再犯: 一般我们请求数据来渲染一个页面的时候,请求下来的数据基本上都是数组或是对象,再通过列表循环和插值表达式渲染的页面:在data 中提前声 ...
- H3C OSPF协议区域LSA发布
- 使用vuex来管理数据
最近一直工作比较忙,博客已经鸽了好久了,趁着今天是周末,写点东西吧 使用vuex来管理数据 最近一直在用vue做项目,但是却从来没真正去用过vuex,因为一直感觉很复杂,其实真正去研究一下啊,就会发现 ...