用硬币换钱

  题目大意:就是有面值为A1,A2,A3....的硬币,各有C1,C2,C3...的数量,问在钱数为m的范围内,能换多少钱?(不找零)

  这题看名字就知道是完全背包,但是这题又有点不一样,因为这题的硬币数不是无限的,所以我们要用点特殊的思路

  因为这题要我们求的是可以整换的钱的面值数,我们只要保证位置合法就可以了,所以dp矩阵内我们可以以面值数的剩余量为dp量,对于j<面值的位置,我们全部设置为当前面值的硬币数量,当j>=面值时,我们考虑两个位置:1:当上一个位置的这个位置合法(也就i-1面值的剩余硬币数>=0),那我们把dp[i][j]位置设置成当前硬币面值的总数(这个是贪心的思想,我们总是想把钱换更大的面值),

  如果dp[i-1][j]非法,那我们就往dp[i][j-coins[i-1]]的位置考量,如果dp[i][j-coins[i-1]]位置还有硬币剩余,那这个位置就dp[i][j-coins[i-1]]-1就好了,因为我们可以拿多一个硬币换出这个面值。

  然后如果dp[i][j-coins[i-1]]非法,那dp[i][j]这个位置自然也就非法了。

  最后再回头看一下上面的思路,我们发现我们只要一个一维数组就行了,因为对于k<j的位置,我们总是先考虑了,而且dp[i-1][j]我们只使用一次

  最后这题排一次序速度会快一点,数量比较小,直接插入排序就好了,复杂度O(n*m)

  最后吐槽一下自己,这一题wa了好几次,因为我一直把上一个位置考虑错了,本来应该考察dp[i-1][j]的,

   结果变成dp[i-1][j-coins[i-1]]

  

 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX(a,b) (a)>(b)?(a):(b) typedef struct coins_set
{
int coins_value;
int coins_sum;
}SET; SET coins[];
int dp[]; void Search(const int, const int); void Insertion_Sort(const int n)
{
int i, j, tmp_v, tmp_s;
for (i = ; i <= n; i++)
{
tmp_v = coins[i].coins_value;
tmp_s = coins[i].coins_sum;
for (j = i; j > && coins[j - ].coins_value > tmp_v; j--)
{
coins[j].coins_value = coins[j - ].coins_value;
coins[j].coins_sum = coins[j - ].coins_sum;
}
coins[j].coins_value = tmp_v;
coins[j].coins_sum = tmp_s;
}
} int main(void)
{
int n, m, i;
while (~scanf("%d%d", &n, &m))
{
if (n == && m == )
break;
//读取钱的总量
for (i = ; i <= n; i++)
scanf("%d", &coins[i].coins_value);
for (i = ; i <= n; i++)
scanf("%d", &coins[i].coins_sum);
Insertion_Sort(n);
Search(n, m);
}
return ;
} void Search(const int n, const int m)
{
int i, j, ans = ; memset(dp, -, sizeof(dp));
for (i = ; i <= coins[].coins_sum; i++)//处理基准状态
{
if (i*coins[].coins_value <= m)
dp[i*coins[].coins_value] = coins[].coins_sum - i;
else break;
}
dp[] = coins[].coins_value;
for (i = ; i <= n; i++)
{
dp[] = coins[i].coins_value;
for (j = ; j <= m; j++)
{
if (j - coins[i].coins_value < )
dp[j] = dp[j] == - ? - : coins[i].coins_sum;
else
{
if (dp[j] != -)
dp[j] = coins[i].coins_sum;
else if (dp[j - coins[i].coins_value] > -)
dp[j] = dp[j - coins[i].coins_value] - ;
else
dp[j] = -;
}
}
}
for (i = ; i <= m; i++)
if (dp[i] > -) ans++;
printf("%d\n", ans);
}

DP:Coins(POJ 1742)的更多相关文章

  1. Coins POJ - 1742

    给出硬币面额及每种硬币的个数,求从1到m能凑出面额的个数. Input 多组数据,每组数据前两个数字为n,m.n表示硬币种类数,m为最大面额,之后前n个数为每种硬币的面额,后n个数为相应每种硬币的个数 ...

  2. [POJ 1742] Coins 【DP】

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

  3. Coins HDU - 2844 POJ - 1742

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

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

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

  5. hdu 2844 poj 1742 Coins

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

  6. poj 1742(好题,楼天城男人八题,混合背包)

    Coins Time Limit: 3000MS   Memory Limit: 30000K Total Submissions: 33269   Accepted: 11295 Descripti ...

  7. The Fewest Coins POJ - 3260

    The Fewest Coins POJ - 3260 完全背包+多重背包.基本思路是先通过背包分开求出"付出"指定数量钱和"找"指定数量钱时用的硬币数量最小值 ...

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

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

  9. Coins (poj 1742 &amp;&amp; hdu 2844 DP)

    Language: Default Coins Time Limit: 3000MS   Memory Limit: 30000K Total Submissions: 30047   Accepte ...

随机推荐

  1. BZOJ-3225 立方体覆盖 线段树+扫描线+乱搞

    看数据范围像是个暴力,而且理论复杂度似乎可行,然后被卡了两个点...然后来了个乱搞的线段树+扫描线.. 3225: [Sdoi2008]立方体覆盖 Time Limit: 2 Sec Memory L ...

  2. nginx&apache比较

    1.nginx相对于apache的优点: 轻量级,同样起web 服务,比apache占用更少的内存及资源 抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx ...

  3. Aop 是面向切面编程,

    Aop 是面向切面编程,是在业务代码中可以织入其他公共代码(性能监控等),现在用普通的方法实现AOP http://blog.csdn.net/heyanfeng22/article/details/ ...

  4. 修改eclipse/MyEclipse中包的显示结构为树形

    在右上边三角那里进去设置 选第一个是显示完整的包名,第二个显示的是树形结构,我们一般用第一种,如下图:

  5. tmux下的滚屏

    先Ctrl+b进入tmux的操作模式,然后用PageUp和PageDown,

  6. ECSHOP编辑器Fckeditor上传图片中文名称乱码的解决方法

    ECSHOP编辑器Fckeditor上传图片中文名称乱码的解决方法 ECSHOP教程/ ecshop教程网(www.ecshop119.com) 2015-02-11   中文名乱码是因为:FCKed ...

  7. Python socket编程之七:多窗口的应用

    f1.py # -*- coding: utf-8 -*- import socket import struct import sqlalchemy import pandas ########## ...

  8. Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/usr/lib/dyld_sim is not owned by root.

    sudo chown -R root /Applications/Xcode6.1.1.app/ 这里把这个 /Applications/Xcode6.1.1.app/替换成你xocde据在的位置

  9. 清空file input框

    测试环境:OS --> winXPBrowsers --> IE6+, FF 3.0.11, FF 3.5, Opera 9.64, Opera 10 beta 2, Safari 4, ...

  10. 我的css释疑-float line-height inline-block vertical-align

    markdown的图片和链接格式相类似: [链接文字/图片的alt text] (链接地址/ 图片的地址), 只是图片要在前面加上感叹号! 当内容中含有图片的时候,如果图片的高度大于行高,则含有图片 ...