• 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背包求解

  • 相关阅读:
    Luogu P1962 斐波那契数列
    Luogu P2370 yyy2015c01的U盘
    Luogu P2678跳石头
    POJ3111 K Best
    表单内容相关操作
    框架集与框架.
    spring aop的使用
    sql查询的优化(六)
    mysql数据库视图(五)
    mysql数据库索引(四)
  • 原文地址:https://www.cnblogs.com/lmjer/p/7988914.html
Copyright © 2020-2023  润新知