zoukankan      html  css  js  c++  java
  • codevs1297 硬币

    1297 硬币

     
    题目描述 Description

    我们知道即使是同一种面值的硬币,它们的重量也有可能不一样,因为它受到许多因素的影响,包括制造工艺和流程上的。但是任何一种面值的硬币的重量总是处于某个特定范围之内。现在已知所有面值的硬币的重量范围。给定一堆硬币的总重量,问这堆硬币的总价值有多少种不同的可能。举例:已知一角硬币的重量在19到21之间,五角硬币的重量在40到43之间。有一堆硬币的总重量为99。则它可以由4个重量为20,1个重量为19的一角硬币组成,其总价值为5角,也可以由1个重量为42的五角硬币和3个重量为19的一角硬币组成,其总价值为8角,再或者由2个重量为40的五角硬币和1个重量为19的一角硬币组成,其总价值为1块1角。因此这堆硬币的总价值共有3种不同的可能。

    输入描述 Input Description

    第一行是一个整数w(10<=w<=100)表示所有硬币的总重量。第二行是一个整数n(1<=n<=7)表示不同面值的硬币总数。接下来n行每行3个整数,依次表示硬币的面值,最小可能重量和最大可能重量。硬币面值不超过50,最小重量不低于2,最大重量不高于100。最大重量和最小重量之间的差距不超过30。

    输出描述 Output Description

    仅包括一行表示这堆硬币的总价值有多少种不同的可能性。

    样例输入 Sample Input

    99

    2

    1 19 21

    5 40 43

    样例输出 Sample Output

    3

    #include <cstdio>
    int n,w,zx[10],zd[10],v[10],ans,f[200][5000];
    int main()
    {
    scanf("%d%d",&w,&n); //w表示总重量,n表示硬币的种类
    for(int i=1;i<=n;i++)
    {
    scanf("%d%d%d",&v[i],&zx[i],&zd[i]); //v表示面值,zx表示最小重量,zd表示最大重量
    for(int j=zx[i];j<=zd[i];j++)
    f[j][v[i]]=1; //有可能的硬币记作1
    }
    for(int i=1;i<=w;i++)//一维重量
    for(int j=1;j<=3000;j++)//二维费用
    {
    if(f[i][j])continue;//已经有该可能性,跳过
    for(int k=1;k<=n;k++)//枚举物品
    if(zx[k]<=i&&v[k]<=j)//价值比它小才有可能
    for(int l=zx[k];l<=zd[k];l++)
    if(i-l>=0&&f[i-l][j-v[k]]==1)
    f[i][j]=1;
    }
    for(int i=1;i<=3000;i++)
    if(f[w][i])ans+=1;
    printf("%d",ans);
    return 0;
    }

  • 相关阅读:
    [转]对Lucene PhraseQuery的slop的理解
    Best jQuery Plugins of 2010
    15 jQuery Plugins To Create A User Friendly Tooltip
    Lucene:基于Java的全文检索引擎简介
    9 Powerful jQuery File Upload Plugins
    Coding Best Practices Using DateTime in the .NET Framework
    Best Image Croppers ready to use for web developers
    28 jQuery Zoom Plugins Creating Stunning Image Effect
    VS2005 + VSS2005 实现团队开发、源代码管理、版本控制(转)
    禁止状态栏显示超链
  • 原文地址:https://www.cnblogs.com/xiaoningmeng/p/5289260.html
Copyright © 2011-2022 走看看