Coins HDU - 2844

POJ - 1742

多重背包可行性

当做一般多重背包,二进制优化

 #include<cstdio>
#include<cstring>
int n,m,anss;
int a[],c[],f[];
int main()
{
int i,j,t;
scanf("%d%d",&n,&m);
while(n!=||m!=)
{
anss=;
memset(f,,sizeof(f));
for(i=;i<=n;i++)
scanf("%d",&a[i]);
for(i=;i<=n;i++)
scanf("%d",&c[i]);
f[]=;
for(i=;i<=n;i++)
{
t=;
while(c[i]>)
{
if(t>c[i]) t=c[i];
c[i]=c[i]-t;
for(j=m;j>=a[i]*t;j--)
f[j]|=f[j-a[i]*t];
t*=;
}
}
for(i=;i<=m;i++)
if(f[i])
anss++;
printf("%d\n",anss);
scanf("%d%d",&n,&m);
}
return ;
}

二进制优化+bitset压位

 #include<cstdio>
#include<cstring>
#include<bitset>
using namespace std;
int n,m,anss;
int a[],c[];
bitset<> f;
int main()
{
int i,j,t;
scanf("%d%d",&n,&m);
while(n!=||m!=)
{
anss=;
f.reset();
for(i=;i<=n;i++)
scanf("%d",&a[i]);
for(i=;i<=n;i++)
scanf("%d",&c[i]);
f[]=;
for(i=;i<=n;i++)
{
t=;
while(c[i]>)
{
if(t>c[i]) t=c[i];
c[i]=c[i]-t;
f|=(f<<(a[i]*t));
t*=;
}
}
for(i=;i<=m;i++)
if(f[i])
anss++;
printf("%d\n",anss);
scanf("%d%d",&n,&m);
}
return ;
}

可以转换成完全背包

http://blog.csdn.net/ac_hell/article/details/51394432

(仅做记录)④对于朴素的方法,这个算法每次只记录一个bool值,损失了不少信息。在这个问题中,不光能够求出是否能得到某个金额,同时还能把得出了此金额时A_i还剩下多少个算出来,这样直接省掉了k那重循环。

我们优化dp的状态:

状态:dp[i][j] : = 用前i种硬币凑成j时第i种硬币最多能剩余多少个( - 1表示配不出来)

转移:

①若dp[i-1][j]>=0,即前i-1种可以配成j,所以根本用不到第i种,所以剩余C_i种  dp[i][j]=C_i

②若j<a[i] || dp[i][j-a[i]]<=0,由于dp[i-1][j]<0,所以要想配成j起码得要有第i种,若j<a[i]则第i种用不到,所以前i种仍配不到j,若dp[i][j-a[i]]<=0,则说明配成j-a[i]时第i种已经无剩余或者甚至无法配成j-a[i],更别说配成j了,        dp[i][j]=-1

③其他情况,由于a[i]还有剩,所以dp[i][j]相当于在dp[i][j-a[i]]的基础上多使用了一个a[i],此时   dp[i][j]=dp[i][j-a[i]]-1

最终找出所有>=0的dp[n][i]个数就行了(1<=i<=m)

#include<cstdio>
#include<cstring>
#include<bitset>
using namespace std;
int n,m,anss;
int a[],c[];
int ans[];
int main()
{
int i,j,t;
scanf("%d%d",&n,&m);
while(n!=||m!=)
{
anss=;
memset(ans,-,sizeof(ans));
ans[]=;
for(i=;i<=n;i++)
scanf("%d",&a[i]);
for(i=;i<=n;i++)
scanf("%d",&c[i]);
for(i=;i<=n;i++)
for(j=;j<=m;j++)
if(ans[j]>=)
ans[j]=c[i];
else if(j<a[i]||ans[j-a[i]]<=)
ans[j]=-;
else ans[j]=ans[j-a[i]]-;
for(i=;i<=m;i++)
if(ans[i]>=)
anss++;
printf("%d\n",anss);
scanf("%d%d",&n,&m);
}
return ;
}

另:二进制优化+bitset压位比转成完全背包要快,可能常数优越?

最新文章

  1. 原生JS:JSON对象详解
  2. 火狐min-height不兼容解决方法
  3. leetcode解题:Add binary问题
  4. Android Studio快捷键每日一练(4)
  5. 【C#】第3章学习要点(三)--常用类和结构的用法
  6. O(1) Check Power of 2 - LintCode
  7. 稍览了一下CommonJS
  8. [BZOJ1998][Hnoi2010]Fsk物品调度
  9. awk 两列相减
  10. http协议与http代理
  11. NET仿微信Oauth2.0
  12. RF环境安装-mac-osx10.10-基础环境-安装指南
  13. Bug跟踪的流程
  14. byte在计算机中的存储方式--Double.byteValue()的输出结果思考
  15. Java EE的未来
  16. Tree 树形结构
  17. 从CAP理论中分析Eureka与zookeeper的区别
  18. Spring3数据源的6种配置方法
  19. HDUOJ----数塔
  20. IDEA-Debug调试操作

热门文章

  1. Jinja2如何默认将None 值显示为空字符串?
  2. Meteor表单
  3. eclipse环境下无法创建android virtual Devices(AVD)问题解决的方法汇总
  4. mongo开启验证
  5. Deepin-安装node
  6. SQL 约束(Constraints)
  7. react-document-title
  8. redux-saga 异步流
  9. springMVC4(16)拦截器解析与登陆拦截模拟
  10. Mac 使用smb协议连接FTPserver