poj 1742 多重背包问题 dp算法
题意:硬币分别有 A1.....An种,每种各有C1......Cn个,问组成小于m的有多少种
思路:多重背包问题
dp[i][j]表示用前i种硬币组成j最多剩下多少个 dp=-1的表示凑不齐
dp[0][0]=0;
for(int i=0;i<n;i++)
for(int j=0;j<=m;j++)
{ if(dp[i][j]>=0) dp[i+1][j]=c[i]; //表示用前i种可以凑齐j元,自然就全部剩下了
else if(j<a[i]||dp[i+1][j-a[i]]<=0) dp[i+1][j]=-1; //表示没法凑
else dp[i+1][j]=dp[i+1][j-a[i]]-1; //表示用了i这种硬币
}
如何数组重用呢?
dp[j]表示前i种硬币(循环)凑成j元最多剩下
dp[0]=0;
for(int i=0;i<n;i++)
for(int j=0;j<=m);j++)
{if(dp[j]>=0) dp[j]=c[i];
else if(j<a[i]||dp[j-a[i]]<=0) dp[j]=-1;
else dp[j]=dp[j-a[i]]-1;}
解决问题的代码:
#include <iostream>
#include <cstdio>
#include <string.h>
using namespace std;
int a[];
int c[];
int dp[ + ];
int main()
{
int n,m;
while (scanf("%d%d", &n, &m) != EOF)
{
if (n == && m == ) break;
for (int i = ; i < n; i++)
scanf("%d", &a[i]);
for (int i = ; i < n; i++)
scanf("%d", &c[i]);
memset(dp, -, sizeof(dp));
dp[] = ;
for(int i=;i<n;i++)
for (int j = ; j <= m; j++)
{
if (dp[j] >= ) dp[j] = c[i];
else if (j < a[i] || dp[j - a[i]] <= ) dp[j] = -;
else dp[j] = dp[j - a[i]] - ;
}
int ans = ;
for (int i = ; i <= m; i++)
{
if (dp[i] >= ) ++ans;
}
printf("%d\n", ans);
}
return ;
}
poj 1742 多重背包问题 dp算法的更多相关文章
- poj 1742 Coins(dp之多重背包+多次优化)
Description People in Silverland use coins.They have coins of value A1,A2,A3...An Silverland dollar. ...
- [POJ 1742] Coins 【DP】
题目链接:POJ - 1742 题目大意 现有 n 种不同的硬币,每种的面值为 Vi ,数量为 Ni ,问使用这些硬币共能凑出 [1,m] 范围内的多少种面值. 题目分析 使用一种 O(nm) 的 D ...
- poj 1742 多重背包
题意:给出n种面值的硬币, 和这些硬币每一种的数量, 要求求出能组成的钱数(小于等于m) 思路:一开始直接用多重背包套上去超时了,然后就没辙了,然后参考网上的,说只需要判断是否能取到就行了,并不需要记 ...
- HDU 2844 Coins (多重背包问题DP)
题意:给定n种硬币,每种价值是a,数量是c,让你求不大于给定V的不同的价值数,就是说让你用这些硬币来组成多少种不同的价格,并且价格不大于V. 析:一看就应该知道是一个动态规划的背包问题,只不过是变形, ...
- Coins HDU - 2844 POJ - 1742
Coins HDU - 2844 POJ - 1742 多重背包可行性 当做一般多重背包,二进制优化 #include<cstdio> #include<cstring> in ...
- 题解报告:hdu 2844 & poj 1742 Coins(多重部分和问题)
Problem Description Whuacmers use coins.They have coins of value A1,A2,A3...An Silverland dollar. On ...
- poj 1742 Coins (动态规划,背包问题)
Coins Time Limit: 3000MS Memory Limit: 30000K Total Submissions: 32977 Accepted: 11208 Descripti ...
- POJ 1742 (单调队列优化多重背包+混合背包)
(点击此处查看原题) 题意分析 给你n种不同价值的硬币,价值为val[1],val[2]...val[n],每种价值的硬币有num[1],num[2]...num[n]个,问使用这n种硬币可以凑齐[1 ...
- hdu 2844 poj 1742 Coins
hdu 2844 poj 1742 Coins 题目相同,但是时限不同,原本上面的多重背包我初始化为0,f[0] = 1;用位或进行优化,f[i]=1表示可以兑成i,0表示不能. 在poj上运行时间正 ...
随机推荐
- 机器学习框架ML.NET学习笔记【9】自动学习
一.概述 本篇我们首先通过回归算法实现一个葡萄酒品质预测的程序,然后通过AutoML的方法再重新实现,通过对比两种实现方式来学习AutoML的应用. 首先数据集来自于竞赛网站kaggle.com的UC ...
- java ReentranLock锁
1.效果和synchronized一样,都可以同步执行,lock方法获得锁,unlock方法释放锁 使用示例: package com.test; import java.util.concurren ...
- ruby 正则表达式 匹配中文
1.puts /[一-龥]+/.match("this is 中文") =>中文 2.str2="123中文"puts / ...
- UI2_同步下载
// // ViewController.m // UI2_同步下载 // // Created by zhangxueming on 15/7/17. // Copyright (c) 2015年 ...
- Java基础:(一)数据类型
一.包装类型 基本类型都有对应的包装类型,基本类型与其对应的包装类型之间的赋值使用自动装箱与拆箱完成. 八个基本类型:boolean/1:byte/8:char/16:short/16:int/32: ...
- AJPFX关于Java中的集合
ava API中所用的集合类,都是实现了Collection接口,他的一个类继承结构如下: Collection<--List<--Vector Collection<--List& ...
- 定时器 & 日期时间对象 & 正则
1 JavaScript 计时事件 通过使用 JavaScript,有能力做到在一个设定的时间间隔之后来执行代码,而不是在函数被调用后立即执行,这称之为计时事件. 两个关键方法是: setInterv ...
- LR使用流程简介之录制方式说明
1.LR脚本录制方式说明1)HTML-based script基于HTML的脚本 从内存中读取并下载资源,较少的关联处理,可以加入图片检查,回放时需要解析返回的信息 a-基于用户行为的方式 web_l ...
- Python之时间表示
Python的time模块中提供了丰富的关于时间操作方法,可以利用这些方法来完成这个需求. time.time() :获取当前时间戳 time.ctime(): 当前时间的字符串形式 time.loc ...
- HDU 1124 Factorial (阶乘后缀0)
题意: 给一个数n,返回其阶乘结果后缀有几个0. 思路: 首先将n个十进制数进行质因数分解,观察的得到只有2*5才会出现10.那么n!应含有min(2个数,5个数)个后缀0,明显5的个数必定比2少,所 ...