Description

People in Silverland use coins.They have coins of value A1,A2,A3...An Silverland dollar.One day Tony opened his money-box and found there were some coins.He decided to buy a very nice watch in a nearby shop. He wanted to pay the exact price(without change) and he known the price would not more than m.But he didn't know the exact price of the watch.

You are to write a program which reads n,m,A1,A2,A3...An and C1,C2,C3...Cn corresponding to the number of Tony's coins of value A1,A2,A3...An then calculate how many prices(form 1 to m) Tony can pay use these coins.

Input

The input contains several test cases. The first line of each test case contains two integers n(1<=n<=100),m(m<=100000).The second line contains 2n integers, denoting A1,A2,A3...An,C1,C2,C3...Cn (1<=Ai<=100000,1<=Ci<=1000). The last test case is followed by two zeros.

Output

For each test case output the answer on a single line.

Sample Input

3 10
1 2 4 2 1 1
2 5
1 4 2 1
0 0

Sample Output

8
4
/**
poj 1742 多重背包的可行性问题
题目大意:给定n种面值的硬币面值分别为wi个数为ci,问用这些硬币可以组成1~m之间的多少面值
解题思路:楼教主的男人八题之一,算是一个经典的问题,定义一个sum数组。每次填dp[j]时直接由dp[j-weight[i]]推出,
前提是sum[j-w[i]]<c[i].sum每填一行都要清零,sum[j]表示当前物品填充j大小的包需要至少使用多少个.复杂度O(n*m)
*/
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <iostream>
using namespace std;
int n,m;
int w[105],c[105],sum[100005],dp[100005];
int main(){
while(~scanf("%d%d",&n,&m)) {
if(n==0&&m==0)break;
for(int i=0;i<n;i++)
scanf("%d",&w[i]);
for(int i=0;i<n;i++)
scanf("%d",&c[i]);
memset(dp,0,sizeof(dp));
dp[0]=1;
int ans=0;
for(int i=0;i<n;i++) {
memset(sum,0,sizeof(sum));
for(int j=w[i];j<=m;j++)
if(!dp[j]&&dp[j-w[i]]&&sum[j-w[i]]<c[i]) {
dp[j]=1;
sum[j]=sum[j-w[i]]+1;
ans++;
}
}
printf("%d\n",ans);
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N = 10 + 100;
const int M = 10 + 1e5;
int n, m, A[N], C[N];
int main() {
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
while (cin >> n >> m && n && m) {
for (int i = 1; i <= n; i++) cin >> A[i];
for (int i = 1; i <= n; i++) cin >> C[i]; bitset<M> dp;
dp[0] = 1;
for (int i = 1; i <= n; i++) {
int k = 1, t = C[i];
while (k < t) {
dp |= (dp << A[i] * k); // 利用 bitset 的特性取得所有组合和
t -= k;
k *= 2;
}
if (t) dp |= (dp << A[i] * t);
} int ans = 0;
for (int i = 1; i <= m; i++) ans += dp[i];
cout << ans << endl;
} return 0;
} /**
状态定义: 设 f(i,j) 表示是否可使用前 i 种硬币拼成 j
转移方程: f(i,j) = f(i-1,j-k*Ai), 0<=k<=Ci
边界条件: f(0,0) = 1, f(0,j) = 0, f(i,0) = 1
**/
#include<bits/stdc++.h>
using namespace std;
const int M = 1e5 + 100;
const int N = 110;
int a[N], c[N], book[M], n, m;
bool dp[M];
//贪心
void Coin() {
memset(dp, false, sizeof dp);
for (int i = 1; i <= n; ++i)cin >> a[i];
for (int i = 1; i <= n; ++i)cin >> c[i];
dp[0] = 1;
for (int i = 1; i <= n; ++i) {
memset(book, 0, sizeof book);
for (int j = a[i]; j <= m; ++j)//贪心
if (!dp[j] && dp[j - a[i]] && book[j - a[i]] < c[i])
dp[j] = true, book[j] = book[j - a[i]] + 1;
}
int ans = 0;
for (int i = 1; i <= m; ++i)if (dp[i])++ans;
cout << ans << endl;
} int main() {
freopen("in.txt", "r", stdin);
ios::sync_with_stdio(false), cin.tie(0);
while (cin >> n >> m && n) Coin();
}

POJ 1742 Coins(多重背包的可行性问题)的更多相关文章

  1. POJ 1742 Coins(多重背包, 单调队列)

    Description People in Silverland use coins.They have coins of value A1,A2,A3...An Silverland dollar. ...

  2. POJ 1742 Coins (多重背包)

    Coins Time Limit: 3000MS   Memory Limit: 30000K Total Submissions: 28448   Accepted: 9645 Descriptio ...

  3. poj 1742 coins_多重背包

    题意:给你N个种硬币,价值和数量,知道手表不大于m,问能组成(1~m)的价格有多少种情况 套套上次那题的模板直接就行了,http://blog.csdn.net/neng18/article/deta ...

  4. POJ 3260 The Fewest Coins(多重背包+全然背包)

    POJ 3260 The Fewest Coins(多重背包+全然背包) http://poj.org/problem?id=3260 题意: John要去买价值为m的商品. 如今的货币系统有n种货币 ...

  5. poj1742 多重背包的可行性问题

    http://poj.org/problem? id=1742 Description People in Silverland use coins.They have coins of value ...

  6. hdu 2844 poj 1742 Coins

    hdu 2844 poj 1742 Coins 题目相同,但是时限不同,原本上面的多重背包我初始化为0,f[0] = 1;用位或进行优化,f[i]=1表示可以兑成i,0表示不能. 在poj上运行时间正 ...

  7. poj 1742 Coins (多重背包)

    http://poj.org/problem?id=1742 n个硬币,面值分别是A1...An,对应的数量分别是C1....Cn.用这些硬币组合起来能得到多少种面值不超过m的方案. 多重背包,不过这 ...

  8. POJ 1742 Coins 【多重背包DP】

    题意:有n种面额的硬币.面额.个数分别为A_i.C_i,求最多能搭配出几种不超过m的金额? 思路:dp[j]就是总数为j的价值是否已经有了这种方法,如果现在没有,那么我们就一个个硬币去尝试直到有,这种 ...

  9. Poj 1742 Coins(多重背包)

    一.Description People in Silverland use coins.They have coins of value A1,A2,A3...An Silverland dolla ...

  10. poj 1742 Coins(二进制拆分+bitset优化多重背包)

    \(Coins\) \(solution:\) 这道题很短,开门见山,很明显的告诉了读者这是一道多重背包.但是这道题的数据范围很不友好,它不允许我们直接将这一题当做01背包去做.于是我们得想一想优化. ...

随机推荐

  1. Modbus 转 PROFIBUS DP 应用场景 PM-160

    1)在网关PROFIBUS DP侧是一个PROFIBUSDP从站,在Modbus串口侧有Modbus主站.Modbus从站.通用模式可选:接口有RS232RS485.RS422三种可选. 2)通信方式 ...

  2. C#/.NET/.NET Core优秀项目和框架2023年11月简报

    前言 公众号每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架(公众号每周至少推荐两个优秀的项目和框架当然节假日除外),公众号推文有项目和框架的介绍.功能特点以及部分截图等(打不开或 ...

  3. MacOS|matplotlib 无法显示中文 解决办法

    matplotlib 无法显示中文 解决办法 画图时,中文无法正常显示,如图 下载字体 点击这里获取字体 提取码: wnby 查看字体路径 在 python 环境中执行以下指令 import matp ...

  4. Feign远程调用超时问题

    1.问题概述 上图的场景,每次重启项目后openFeign都会报一个超时异常,异常信息如下 2.为什么会产生这个异常? 当项目刚启动时,数据库连接池的中的连接并不会创建;第一次请求的时候才会初始化各种 ...

  5. Codeforces Round 911 (Div. 2) 总结

    第一次在赛场上敲莫反,还好最后调出来了! A 题意:你在Minecraft里挖了一些一格的坑(同一列),问你用几桶水可以填满它(可以造无限水). 解法:找大于 \(2\) 的连续段,有的话就是两桶,没 ...

  6. MinIO客户端之alias

    MinIO提供了一个命令行程序mc用于协助用户完成日常的维护.管理类工作. 官方资料 mc alias mc alias list mc alias remove mc alias set mc al ...

  7. 开源、强大的Linux服务器集群管理工具,比宝塔好用!

    在这之前肯定很多人都接触过Linux管理面板:宝塔,宝塔的确非常方便而且好用,安装也简单,复制粘贴几句命令即可安装完成,且提供免费版.今天呢,民工哥向大家介绍另一个Linux的服务器管理面板--App ...

  8. .net Core实战简单文件服务器

    首先新建一个ASP.NET Core 项目,选中空的模板,如下图所示 在NuGet包中添加Microsoft.AspNetCore.StaticFiles 添加好以后我们在Startup.cs中添加对 ...

  9. 【开源项目】轻量元数据管理解决方案——Marquez

    大家好,我是独孤风. 又到了本周的开源项目推荐.最近推荐的元数据管理项目很多,但是很多元数据管理平台的功能复杂难用. 那么有没有轻量一点的元数据管理项目呢? 今天为大家推荐的开源项目,就是一个轻量级的 ...

  10. 你的JoinHint为什么不生效

    本文分享自华为云社区<你的JoinHint为什么不生效[绽放吧!GaussDB(DWS)云原生数仓]>,作者:你是猴子请来的救兵吗 . 引言 提起数据库的Hint,几乎每个DBA都知道这一 ...