Vjudge传送门

$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 ;
}

最新文章

  1. 线下线上对接的一种思路(本地erp与线上电子商务平台对接)
  2. 针对PIL中ImageDraw.py报错的解决方案
  3. eclipse lint工具介绍
  4. Hdu3812-Sea Sky(深搜+剪枝)
  5. Jquery datatable 动态隐藏列(根据有无值)
  6. HDFS概述(5)————HDFS HA
  7. oracle 处理时间和金额大小写的相关函数集合
  8. WPF自学入门(一)WPF-XAML基本知识
  9. python学习:continue及break使用
  10. Edge Intelligence: On-Demand Deep Learning Model Co-Inference with Device-Edge Synergy
  11. GDB调试指南-启动调试
  12. SQL FOREIGN KEY 约束
  13. Python 汉诺塔
  14. ajax用户是否存在
  15. mint19 源码安装python3.7
  16. csdn博客
  17. Maven入门详情
  18. 20145219《网络对抗》MSF基础应用
  19. 在C#里面获得应用程序的当前路径
  20. 3D旋转相册的实现

热门文章

  1. H3C 802.11无线网络的介质访问控制
  2. 全面理解Python中的类型提示(Type Hints)
  3. PHP开源框架Laravel的安装与配置
  4. caffe学习(1):多平台下安装配置caffe
  5. redis_Cacha 爬虫链接redis配置文件
  6. css 百分比继承关系的探讨
  7. Acegi框架介绍
  8. java 字节→字符转换流
  9. Linux 内核驱动支持什么设备
  10. CodeForce - 1189 D1. Add on a Tree (思维题)