zoukankan      html  css  js  c++  java
  • 九度 1531:货币面值(01背包)

    题目描述:

    小虎是游戏中的一个国王,在他管理的国家中发行了很多不同面额的纸币,用这些纸币进行任意的组合可以在游戏中购买各种装备来提升自己。有一天,他突然很想知道这些纸币的组合不能表示的最小面额是多少,请聪明的你来帮助小虎来解决这个财政问题吧

    思路

    1. 面值最小额度, 枚举的话时间复杂度为 o(n^3). 但思考一下就会发现其实这是背包问题恰好装满的变形题

    2. 背包问题恰好装满是在朴素背包问题的基础上初始化 dp[0] = 0, dp[i] = 负无穷. 这样就会使得不能恰好装满的容量都是负无穷

    3. 下面的代码设置的是 int dp[], 其实设置成 bool dp[] 也是可以的

    代码

    #include <iostream>
    #include <stdio.h>
    #include <memory.h>
    using namespace std;
    
    const int INF = 10005;
    int dp[10010];
    int money[110];
    
    void dodp(int n) {
        memset(dp, 0x80, sizeof(dp));
        
        dp[0] = 0;
        for(int i = 0; i < n; i ++) {
            for(int v = INF; v >= 0; v --) {
                if(v >= money[i])
                    dp[v] = max(dp[v-money[i]]+money[i], dp[v]);
            }
        }
    
        for(int i = 0; i < INF; i++) {
    
            if(dp[i] < 0) {
                cout << i << endl;    
                break;
            }
                
        }
    }
    
    int main() {
        
        int n;
        while(scanf("%d", &n) != EOF) {
            for(int i = 0; i < n; i ++)
                scanf("%d", money+i);
            dodp(n);
        }
        return 0;
    }
  • 相关阅读:
    一些特殊的矩阵快速幂 hdu5950 hdu3369 hdu 3483
    HDU
    UVA-796 Critical Links 找桥
    HDU 4612 Warm up
    2017 ICPC乌鲁木齐 A Coins 概率dp
    HDU6223 Infinite Fraction Path bfs+剪枝
    Java基础知识学习(一)
    算法(一)
    面试题整理:SQL(二)
    面试题整理:SQL(一)
  • 原文地址:https://www.cnblogs.com/xinsheng/p/3580202.html
Copyright © 2011-2022 走看看