zoukankan      html  css  js  c++  java
  • 01背包求解面值组成问题

    货币面值

    成绩 100 开启时间 2016年05月30日 星期一 06:10
    折扣 0.8 折扣时间 2016年05月30日 星期一 06:10
    允许迟交 关闭时间 2016年05月30日 星期一 06:10
    输入文件 Currency.in 输出文件 Currency.out

    【题目描述】货币面值(Currency.cpp/c/pas)九度OJ 1531

    魔法世界发行了很多不同面值的纸币,试求出用这些纸币进行任意的组合不能表示的最小面值是多少。

    【输入格式】

    输入包含多个测试用例,每组测试用例的第一行输入一个整数N(N≤100)表示流通的纸币面额数量,第二行是N个纸币的具体表示面额,取值范围为1~100。

    【输出格式】

    对于每组测试用例,输出一个整数,表示已经发行的所有纸币都不能表示的最小面值(已经发行的每个纸币面值最多只能使用一次,但面值可能有重复)。

    【输入样例】

    5

    1 2 3 9 100

    5

    1 2 4 9 100

    5

    1 2 4 7 100

    【输出样例】

    7

    8

    15

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    int dp[10000+5];
    int a[100+5];
    int main(){
        freopen("Currency.in","r",stdin);
        freopen("Currency.out","w",stdout);
        int n;
        while(scanf("%d",&n)!=EOF){
          int MAX=0;
           memset(dp,0,sizeof(dp));
           for (int i=1;i<=n;i++){
            scanf("%d",&a[i]);
            MAX+=a[i];
           }
           for (int i=1;i<=n;i++){
            for (int j=MAX;j>=a[i];j--){
                    dp[j]=max(dp[j],dp[j-a[i]]+a[i]);
           }
        }
        for (int i=1;i<=MAX;i++){
            if(dp[i]!=i) {
                printf("%d ",i);
                break;
            }
        }
      }
    return 0;
    }

    当求解货币可组成的面值问题时,可用01背包求解

  • 相关阅读:
    Android PopupWindow显示位置和显示大小
    线性回归与梯度下降
    nginx启动过程分析
    项目管理学习笔记之三.绩效分析
    会计总论读书笔记
    电子书阅读及工具
    mybatis-mysql小优化
    List去重
    JAVA8之lambda表达式详解,及stream中的lambda使用
    linux部署mongodb及基本操作
  • 原文地址:https://www.cnblogs.com/lmjer/p/7988914.html
Copyright © 2011-2022 走看看