[POI2005]BAN-Bank Notes (dp、倍增)

第一问 :求最小硬币数

#include<bits/stdc++.h>
using namespace std;
const int N=20500;
int dp[N],b[N],c[N],mon[N],num[N],D[N];
int len,n,k,v;
inline int read() {
    char c = getchar();
    int x = 0, f = 1;
    while(c < '0' || c > '9') {
        if(c == '-') f = -1;
        c = getchar();
    }
    while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
    return x * f;
}
int main()
{
    n = read();
    for(int i = 1; i <= n; i++) scanf("%d",&b[i]);
    for(int i = 1; i <= n; i++){
/*倍增的核心作用:二进制优化枚举2:
“如果一个物品有ci个,我们把它分成20,21,……2k的几份,把每一份视为一个物体,”来做多重背包即可

和多重背包的思想有点类似?把相同的物品看作不同的,用二进制化(倍增)优化*/
     scanf("%d",&c[i]);  
       for(int k = 0; k <= 15; k++){  //2的15次方是三万多…_(:3_|_)_  
         if(c[i] >= (1 << k)){
            c[i] -= (1 << k);
            mon[++len] = (1 << k) * b[i];   //单份的值 
            num[len] = (1 << k);  //单份数量   
            }
            else break;
        }
        if(c[i]){ 
            mon[++len] = c[i] * b[i];
            num[len] = c[i];
        }
    }
   //就剩下单纯求解背包问题了 
    v = read();
    for(int i = 1; i <= v; i++) dp[i] = 999;  //静态查错太重要了_(:3_|_)_ 
     
    for(int i = 1; i <= len; i++)
     for(int j = v; j >= mon[i]; j--) 
        dp[j]=min(dp[j],dp[j-mon[i]]+num[i]);
    printf("%d",dp[v]);
    return 0;
}   

第二问:(做完这道二维偏序我就来填坑啊哈……_(:3_|_)_

posted @ 2019-08-27 17:36  QUEKI嶺冬  阅读(183)  评论(0编辑  收藏  举报
/*! Color themes for Google Code Prettify | MIT License | github.com/jmblog/color-themes-for-google-code-prettify */ .pln{color:#4d4d4c}ol.linenums{margin-top:0;margin-bottom:0;color:#8e908c}li.L0,li.L1,li.L2,li.L3,li.L4,li.L5,li.L6,li.L7,li.L8,li.L9{padding-left:1em;background-color:#fff;list-style-type:decimal!important;}@media screen{.str{color:#718c00}.kwd{color:#8959a8}.com{color:#8e908c}.typ{color:#4271ae}.lit{color:#f5871f}.pun{color:#4d4d4c}.opn{color:#4d4d4c}.clo{color:#4d4d4c}.tag{color:#c82829}.atn{color:#f5871f}.atv{color:#3e999f}.dec{color:#f5871f}.var{color:#c82829}.fun{color:#4271ae}} /*下面是我设置背景色,字体大小和字体*/ .cnblogs-markdown code{ background:#fff!important; } .cnblogs_code,.cnblogs_code span,.cnblogs-markdown .hljs{ font-size:16px!important; } .syntaxhighlighter a, .syntaxhighlighter div, .syntaxhighlighter code, .syntaxhighlighter table, .syntaxhighlighter table td, .syntaxhighlighter table tr, .syntaxhighlighter table tbody, .syntaxhighlighter table thead, .syntaxhighlighter table caption, .syntaxhighlighter textarea { font-size: 16px!important; } .cnblogs_code, .cnblogs_code span, .cnblogs-markdown .hljs{ font-family:consolas, "Source Code Pro", monaco, monospace !important; } //以上是代码高亮 /* 文字特效 */