题意:硬币分别有 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算法的更多相关文章

  1. poj 1742 Coins(dp之多重背包+多次优化)

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

  2. [POJ 1742] Coins 【DP】

    题目链接:POJ - 1742 题目大意 现有 n 种不同的硬币,每种的面值为 Vi ,数量为 Ni ,问使用这些硬币共能凑出 [1,m] 范围内的多少种面值. 题目分析 使用一种 O(nm) 的 D ...

  3. poj 1742 多重背包

    题意:给出n种面值的硬币, 和这些硬币每一种的数量, 要求求出能组成的钱数(小于等于m) 思路:一开始直接用多重背包套上去超时了,然后就没辙了,然后参考网上的,说只需要判断是否能取到就行了,并不需要记 ...

  4. HDU 2844 Coins (多重背包问题DP)

    题意:给定n种硬币,每种价值是a,数量是c,让你求不大于给定V的不同的价值数,就是说让你用这些硬币来组成多少种不同的价格,并且价格不大于V. 析:一看就应该知道是一个动态规划的背包问题,只不过是变形, ...

  5. Coins HDU - 2844 POJ - 1742

    Coins HDU - 2844 POJ - 1742 多重背包可行性 当做一般多重背包,二进制优化 #include<cstdio> #include<cstring> in ...

  6. 题解报告:hdu 2844 & poj 1742 Coins(多重部分和问题)

    Problem Description Whuacmers use coins.They have coins of value A1,A2,A3...An Silverland dollar. On ...

  7. poj 1742 Coins (动态规划,背包问题)

    Coins Time Limit: 3000MS   Memory Limit: 30000K Total Submissions: 32977   Accepted: 11208 Descripti ...

  8. POJ 1742 (单调队列优化多重背包+混合背包)

    (点击此处查看原题) 题意分析 给你n种不同价值的硬币,价值为val[1],val[2]...val[n],每种价值的硬币有num[1],num[2]...num[n]个,问使用这n种硬币可以凑齐[1 ...

  9. hdu 2844 poj 1742 Coins

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

随机推荐

  1. opencv 形态学膨胀和腐蚀以及开运算和闭运算

  2. docker mysql安装

    Docker MySQL-Server 安装1.搜索docker search mysql# 一般会选择mysql-server 版本 2.拉取 docker pull mysql-server 3. ...

  3. D. Statistics of Recompressing Videos

    D. Statistics of Recompressing Videos time limit per test 3 seconds memory limit per test 256 megaby ...

  4. Could not load file or assembly 'Oracle.ManagedDataAccessDTC.DLL' or one of its dependencies.

    Could not load file or assembly 'Oracle.ManagedDataAccessDTC.DLL' or one of its dependencies.  不是有效的 ...

  5. 选择控件js插件和使用方法

    记录一下 选择控件js插件 /* * 滚动控件,包含地址选择.时间选择.自定义单选 */ //js_inputbox input 输入框 //js_pickviewselect 下拉单项选择 //js ...

  6. Redis set(集合)

    Redis 的 Set 是 String 类型的无序集合,元素不允许重复. Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1). 集合中最大的元素数为 232 - 1 ( ...

  7. HTML视频简介

    此文章复制原来文章,原网址是https://www.html5rocks.com/zh/tutorials/video/basics/#toc-encode 简介 视频标记是 HTML5 功能中备受关 ...

  8. python基础教程总结15——7 自定义电子公告板

    1. Python进行SQLite数据库操作 简单的介绍 SQLite数据库是一款非常小巧的嵌入式开源数据库软件,也就是说没有独立的维护进程,所有的维护都来自于程序本身.它是遵守ACID的关联式数据库 ...

  9. Angularjs 列表页面筛选

    个人博客链接:http://blog.yangqiong.com.cn/angularjs-lie-biao-ye-mian-shai-xuan/ 需求:页面URL和查询结果保持一致,当筛选条件变化时 ...

  10. JDBC对数据库的简单操作

    /** * 获取数据库连接 */ public Connection GetConnection(){ Connection connection=null; try { Class.forName( ...