意甲冠军:你有N种硬币,每个价格值A[i],每个号码C[i],要求。

在不超过M如果是,我们用这些硬币,有多少种付款的情况下,。那是,:1,2,3,4,5,....,M这么多的情况下,,你可以用你的硬币不找零,种情况。

比如:

你有一种硬币,价值2。个数2,那么 你是不能付款 3元的。。你仅仅能付款2,或者4元。。

OK,题意差点儿相同就是这样啦。

那么这里有两种方式!

分析:

那么这里我们能够用多重背包来解决,我们把价值和重量看成一样的w[i] = A[i];用M作为背包。

那么dp 过后。我们就能够知道 dp[i] 表示的含义为,不超过i元钱的情况下,用拥有的硬币能构成的最大钱数。那么非常明显,假设dp[i] = i,意思就是 用拥有的钱,能够刚好构成 i 元钱,上马:

//281MS 648K
#include <stdio.h>
#include <string.h> #define MAX 102 int ans;//最后答案
int n,m;
int A[MAX],C[MAX];
int dp[100005]; void ZeroOne(int V,int W)
{
for(int i = m; i >= V; i--)
//dp[i] = dp[i]>dp[i-V]+W ? dp[i]:dp[i-V]+W;
if(dp[i]<dp[i-V]+W)
{
dp[i] = dp[i-V]+W;//这里需改动如此统计
if(dp[i] == i) ans ++;//在dp过程中,会有出现dp[j]更新为j的时候 且仅仅有一次,也要放在dp[i]=dp[i-V]+W;此语句后
}
} int main()
{
while(scanf("%d%d",&n,&m),n+m)
{
ans = 0;
memset(dp,0,sizeof(dp));
for(int i = 1; i <= n; i ++) scanf("%d",&A[i]);
for(int i = 1; i <= n; i ++) scanf("%d",&C[i]); for(int i = 1; i <= n; i ++)
{
if(A[i]*C[i] >= m)
{
for(int j = A[i]; j <= m; j ++)
//dp[j] = dp[j]>dp[j-A[i]]+A[i] ? dp[j]:dp[j-A[i]]+A[i]; //将价值和重量看做同样
if(dp[j]<dp[j-A[i]]+A[i]) //这里需改动如此统计ans
{
dp[j] = dp[j-A[i]]+A[i];
if(dp[j] == j) ans ++; //在dp过程中,会有出现dp[j]更新为j的时候 且仅仅有一次,也要放在dp[i]=dp[i-V]+W;此语句后
}
}
else
{
int k = 1;
while(k <= C[i])
{
ZeroOne(A[i]*k,A[i]*k);
C[i] -= k;
k *= 2;
}
ZeroOne(C[i]*A[i],C[i]*A[i]);
}
}
//for(int i = 1; i <= m; i ++) if(dp[i]==i)ans++;//这里用以用在hdu,可是poj须要用上面的方式统计ans,不然会超时,过了也过得非常险 2654ms........汗。。 。。 。 printf("%d\n",ans);
}
return 0;
}

那么这里另一种方式

用flag[i]表示能不能构成 钱为 i 的情况

time[j] 表示,构成 j 元钱的时候,用第 i 种硬币的个数

#include <iostream>
#include <cstring>
using namespace std; #define MAX 100005 int N,M;
int A[MAX],C[MAX];
bool flag[MAX];
int time[MAX]; int main()
{
while(cin >> N >> M)
{
if(!N && !M)break;
for(int i = 0; i < N; i ++) cin >> A[i];
for(int i = 0; i < N; i ++) cin >> C[i]; int ans = 0;
memset(flag,false,sizeof(flag));
flag[0] = true;
for(int i = 0; i < N; i ++){
memset(time,0,sizeof(time));
for(int j = A[i]; j <= M; j ++){//这里解释为。仅仅有当前j这样的情况没有构成,而且j-A[i]的情况存在--(这里也就是相似全然背包,这次状态应该依赖前面存在情况),同一时候到j为止。用第i种硬币的数量不超过C[i]的情况下才满足条件
if(!flag[j] && flag[j-A[i]] && time[j-A[i]]+1 <= C[i]){
flag[j] = true;
time[j] = time[j-A[i]]+1;
ans ++;
}
}
}
cout << ans <<endl;
}
return 0;
}

个人愚昧观点,欢迎指正与讨论

版权声明:本文博主原创文章,博客,未经同意不得转载。

hdu2844 &amp; poj1742 Coin ---多重背包--两种方法的更多相关文章

  1. windows下获取IP地址的两种方法

    windows下获取IP地址的两种方法: 一种可以获取IPv4和IPv6,但是需要WSAStartup: 一种只能取到IPv4,但是不需要WSAStartup: 如下: 方法一:(可以获取IPv4和I ...

  2. android 之 启动画面的两种方法

    现在,当我们打开任意的一个app时,其中的大部分都会显示一个启动界面,展示本公司的logo和当前的版本,有的则直接把广告放到了上面.启动画面的可以分为两种设置方式:一种是两个Activity实现,和一 ...

  3. [转载]C#读写txt文件的两种方法介绍

    C#读写txt文件的两种方法介绍 by 大龙哥 1.添加命名空间 System.IO; System.Text; 2.文件的读取 (1).使用FileStream类进行文件的读取,并将它转换成char ...

  4. php如何防止图片盗用/盗链的两种方法(转)

    图片防盗链有什么用? 防止其它网站盗用你的图片,浪费你宝贵的流量.本文章向大家介绍php防止图片盗用/盗链的两种方法 Apache图片重定向方法 设置images目录不充许http访问 Apache服 ...

  5. WPF程序将DLL嵌入到EXE的两种方法

    WPF程序将DLL嵌入到EXE的两种方法 这一篇可以看作是<Visual Studio 版本转换工具WPF版开源了>的续,关于<Visual Studio 版本转换工具WPF版开源了 ...

  6. MongoDB实现分页(两种方法)

    1.插入实验数据 偷懒用下samus,100条. ; i < ; i++) { Document doc = new Document(); doc["ID"] = i; d ...

  7. css:图标与文字对齐的两种方法

    (好久没写博客了,这几个月的积累比较零碎,记在本子上,现在开始整理归类) 在平时写页面的过程中,常遇到要把小图标与文字对齐的情况.比如: 总结了两种方法,代码量都比较少. 第一种 对img设置竖直方向 ...

  8. .net中创建xml文件的两种方法

    .net中创建xml文件的两种方法 方法1:根据xml结构一步一步构建xml文档,保存文件(动态方式) 方法2:直接加载xml结构,保存文件(固定方式) 方法1:动态创建xml文档 根据传递的值,构建 ...

  9. 两种方法设置disabled属性

    //两种方法设置disabled属性 $('#fileup').attr("disabled",true); $('#fileup').attr("disabled&qu ...

随机推荐

  1. 《深入了解Android:Wi-Fi、NFC和GPS音量》勘误表

    资源下载更新(我不知道为什么被115网盘屏蔽) 深入了解android它wifi-nfc-gps 115网盘礼包码:5lbee5qn4g5ghttp://115.com/lb/5lbee5qn4g5g ...

  2. Python多线程的threading Event

    Python threading模块提供Event对象用于线程间通信.它提供了一组.拆除.等待用于线程间通信的其他方法. event它是沟通中最简单的一个过程之中,一个线程产生一个信号,号.Pytho ...

  3. Java进阶 创建和销毁对象

    最近准备写点Javase的东西,希望可以帮助大家写出更好的代码. 1.给不可实例化的类提供私有构造器 比如:每个项目中都有很多工具类,提供了很多static类型的方法供大家使用,谁也不希望看到下面的代 ...

  4. 标准I/O缓冲:全缓冲、行缓冲、无缓冲

    说明:我仅仅对网络资源进行了整合,方便学习-.- 基于流的操作终于会调用read或者write函数进行I/O操作.为了使程序的执行效率最高,流对象一般会提供缓冲区,以降低调用系统I/O库函数的次数. ...

  5. 基于最简单的FFmpeg采样读取内存读写:存储转

    ===================================================== 基于最简单的FFmpeg样品系列读写内存列表: 最简单的基于FFmpeg的内存读写的样例:内 ...

  6. Oracle GoldenGate (以下简称ogg)在异种移植os同一种db之间的数据同步。

    Oracle GoldenGate (以下简称ogg)在异种移植os同一种db之间的数据同步. ogg要实现的功能: 同步可以细化到单个表,满足特定的where条件rows同步,称号column同步. ...

  7. 主攻ASP.NET MVC4.0之重生:ASP.NET MVC使用JSONP

    原文:主攻ASP.NET MVC4.0之重生:ASP.NET MVC使用JSONP 原文地址 http://www.codeguru.com/csharp/.net/net_asp/using-jso ...

  8. Aix db2 经user a using b连接时报SQL30082N Security processing failed with reason &quot;42&quot;

    db2inst1登录 输入实例文件夹:/opt/ibm/db2/V9.7/instance 关闭实例:db2stop 更新示例:./db2iupdt db2inst1 启动实例:db2start 再次 ...

  9. 数据结构之计算器的实现(JAVA)(四)

    原理: 1.将中序表达式变化兴许表达式 2.当前字符为数字,将该数字放入栈中 3.当前字符为操作符,从栈中取出两个树,依据操作符来运算,将运算结果放入到栈中 4.反复,直到将字符操作完.此时栈中仅仅剩 ...

  10. unity调用安卓打包apk时的错误unable to convert classes into dex format

    出现这种问题一般是由于有重复的文件所致,看下unity报的错误那些文件重复了,把重复的文件删了即可 例如,将eclipse中的安卓工程bin\class导出jar包时,会将下面的.class文件打包, ...