1297 硬币

1297 硬币

时间限制: 1 s

空间限制: 128000 KB

题目等级 : 黄金 Gold

题解

题目描述 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

数据范围及提示 Data Size & Hint

分类标签 Tags 点此展开

动态规划 背包型DP 搜索

AC代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<string>
using namespace std;
//网络代码 粘贴一下
int dp[105][2555];//i重量是否存在j面值;dp[i][j]=dp[i-l][j-w];
int v[10],mi[10],ma[10];
int main(){
    int w,n;
    int i,j,k,l;
    memset(dp,0,sizeof(dp));
    cin>>w>>n;
    for(i=1;i<=n;i++) cin>>v[i]>>mi[i]>>ma[i];
    for(i=1;i<=n;i++) for(j=mi[i];j<=ma[i];j++) dp[j][v[i]]=1;
    for(i=1;i<=w;i++){//重量从1到目标w;
        for(j=1;j<=2500;j++){//面值从1到最大可能面值2500;
            for(k=1;k<=n;k++){//为了得知i重量j面值是否存在,枚举尝试各种物品放入前是否存在;
                if(dp[i][j]) break;//如果已经存在就不用再判断了,直接break;
                if(mi[k]<=i&&v[k]<=j)
                for(l=mi[k];l<=ma[k];l++){//第k个物品存在重量的可能;
                    if(dp[i][j]) break;//若已经存在就break;
                    if(i-l>=0){//防止内存非法读取;
                        dp[i][j]=dp[i-l][j-v[k]];//只要dp[i-l][j-v[k]]存在,那么dp[i][j]也必然存在;
                    }
                }
            }
        }
    }
    int s=0;
    for(i=1;i<=2555;i++){
        if(dp[w][i])
            {s++;}
    }
    cout<<s<<endl;
    return 0;
}
时间: 2024-10-14 19:39:29

1297 硬币的相关文章

CODEVS——T 1297 硬币

http://www.codevs.cn/problem/1297/ 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 我们知道即使是同一种面值的硬币,它们的重量也有可能不一样,因为它受到许多因素的影响,包括制造工艺和流程上的.但是任何一种面值的硬币的重量总是处于某个特定范围之内.现在已知所有面值的硬币的重量范围.给定一堆硬币的总重量,问这堆硬币的总价值有多少种不同的可能.举例:已知一角硬币的重量在19到21之间,五角硬币的

code[VS] 1297 硬币

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

codevs1297 硬币

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

【bzoj1042】 HAOI2008—硬币购物

http://www.lydsy.com/JudgeOnline/problem.php?id=1042 (题目链接) 题意:共有4种硬币,面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚ci硬币,买s的价值的东西.请问每次有多少种付款方法. Solution  容斥原理.  设F[i]为不考虑每种硬币的数量限制的情况下,得到面值i的方案数.则状态转移方程为 F[i]=Sum{F[i-C[k]] | i-C[k]>=0 且 k=1..4} ,边界条件F[0]=0. 

[HAOI2008]硬币购物

[HAOI2008]硬币购物 题目描述 硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚ci硬币,买si的价值的东西.请问每次有多少种付款方法. 输入输出格式 输入格式: 第一行 c1,c2,c3,c4,tot 下面tot行 d1,d2,d3,d4,s 输出格式: 每次的方法数 输入输出样例 输入样例#1: 1 2 5 10 2 3 2 3 1 10 1000 2 2 2 900 输出样例#1: 4 27 说明 di,s<=100000 to

蓝桥杯 [翻硬币] 贪心

题目链接:http://lx.lanqiao.cn/problem.page?gpid=T29 题目大意:给两个串,初始串和目标串,每一位表示硬币的正反状态.一次操作的定义是让两个相邻的硬币反面.问从初始状态到目标状态所需要的最少操作次数是多少. 关键思想:贪心.要知道如果两个串的某一位不同,那这一位必然要经历奇数次操作,而且先翻或者后翻是没有影响的.那你想,既然是奇数次,那么最好的情况就是一次搞定啊.解决方案是有的,也很容易想--从左到右扫描,一旦扫描到一位不同,就执行一次操作,而此后的所有操

动态规划 硬币问题

题目:有n种硬币,面值分别为V1,V2,...Vn,每种都有无限多.给定非负整数S,可以选用多少个硬币,使得面值之和恰好为S?输出硬币数目的 最小值和最大值! 如果我们有面值为1元.3元和5元的硬币若干枚,如何用最少的硬币凑够11元? (表面上这道题可以用贪心算法,但贪心算法无法保证可以求出 解,比如1元换成2元的时候) 首先我们思考一个问题,如何用最少的硬币凑够i元(i<11)?为什么要这么问呢? 两个原因:1.当我们遇到一个大问题时,总是习惯把问题的规模变 小,这样便于分析讨论. 2.这个规

【TK】1025: 统计硬币

1025: 统计硬币 时间限制: 1 Sec  内存限制: 32 MB提交: 2409  解决: 1107[提交][状态][下载(1元)] 题目描述 假设一堆由1分.2分.5分组成的n个硬币总面值为m分,求一共有多少种可能的组合方式(某种面值的硬币可以数量可以为0). 输入 输入数据第一行有一个正整数T,表示有T组测试数据.接下来的T行,每行有两个数n,m,n和m的含义同上. 输出 对于每组测试数据,请输出可能的组合方式数,每组输出占一行. 样例输入 2 3 5 4 8 样例输出 1 2 1 0

luogu P1146 硬币翻转

题目描述 在桌面上有一排硬币,共N枚,每一枚硬币均为正面朝上.现在要把所有的硬币翻转成反面朝上,规则是每次可翻转任意N-1枚硬币(正面向上的被翻转为反面向上,反之亦然).求一个最短的操作序列(将每次翻转N-1枚硬币成为一次操作). 输入输出格式 输入格式: 输入只有一行,包含一个自然数N(N为不大于100的偶数). 输出格式: 输出文件的第一行包含一个整数S,表示最少需要的操作次数.接下来的S行每行分别表示每次操作后桌上硬币的状态(一行包含N个整数(0或1),表示每个硬币的状态:0――正面向上,