• [bzoj1531][POI2005]Bank notes


    Description

    Byteotian;Bit;Bank(BBB)拥有一套先进的货币系统,这个系统一共有n种面值的硬币,面值分别为b_1,b_2,...,b_n.但是每种硬币有数量限制,现在我们想要凑出面值k求最少要用多少个硬币.

    Input

    第一行一个数n.

    第二行n个整数b_1,b_2,...,b_n.

    第三行n个整数c_1,c_2,...,c_n,表示每种硬币的个数.

    最后一行一个数k,表示要凑的面值数量.

    Output

    一行一个数,表示最少需要付的硬币数.

    Sample Input

    3
    2 3 5
    2 2 1
    10

    Sample Output

    3

    HINT

    1;leq;n;leq;200,1;leq;b_1<b_2<...<b_n;leq;20000,

    1;leq;c_i;leq;20000,1;leq;k;leq;20000.

    Solution

    f[i][j]表示用前i种硬币凑出价值j所需最少硬币数.

    f[i][j]=min(f[i][j-b_i;	imes;k]+k);(0;leq;k;leq;c_i)

    对于对b_i取模结果相同的j,可以用单调队列进行优化.

    #include<cmath>
    #include<ctime>
    #include<queue>
    #include<stack>
    #include<cstdio>
    #include<vector>
    #include<cstring>
    #include<cstdlib>
    #include<iostream>
    #include<algorithm>
    #define N 205
    #define M 20005
    using namespace std;
    int f[N][M],b[N],c[N],q[M],h,t,n,m;
    inline void init(){
        scanf("%d",&n);
        for(int i=1;i<=n;++i)
            scanf("%d",&b[i]);
        for(int i=1;i<=n;++i)
            scanf("%d",&c[i]);
        scanf("%d",&m);
        for(int i=0;i<=n;++i)
            for(int j=1;j<=m;++j)
                f[i][j]=M;
        for(int i=1;i<=n;++i){
            for(int k=0;k<b[i];++k){
                h=1;t=0;
                for(int j=k;j<=m;j+=b[i]){
                    while(h<=t&&(j-q[h])/b[i]>c[i]) ++h;
                    q[++t]=j;
                    while(h<t&&f[i-1][q[t]]<=f[i-1][q[t-1]]+(j-q[t-1])/b[i]){
                        q[t-1]=q[t];--t;
                    }
                    f[i][j]=min(f[i-1][q[h]]+(j-q[h])/b[i],M);
                }
            }
        }
        printf("%d
    ",f[n][m]);
    }
    int main(){
        freopen("bag.in","r",stdin);
        freopen("bag.out","w",stdout);
        init();
        fclose(stdin);
        fclose(stdout);
        return 0;
    }
  • 相关阅读:
    《大话数据结构》第9章 排序 9.9 快速排序(下)
    [HTML5 DOM] dispatchEvent
    [AWS SAP] Exam Tips 2 Continues Improvement for Existing Solutions
    遇见C++ PPL:C++ 的并行和异步
    遇见C++ AMP:在GPU上做并行计算
    遇见C++ Lambda
    遇见C++ AMP:GPU的线程模型和内存模型
    服务器推技术
    转http状态码
    extjs同步与异步请求互换
  • 原文地址:https://www.cnblogs.com/AireenYe/p/6075988.html
Copyright © 2020-2023  润新知