1. 程式人生 > >洛谷 P5020 【貨幣系統】

洛谷 P5020 【貨幣系統】

其他 一個 lan 然而 lang space memset ber %d

"簡" "單" 的完全背包O_O

來一個開心的AC代碼

#include<cstdio>
#include<cstring>
#define __________ 100005
#define ___________ "%d"
#define ____________ scanf
#define _____________ memset
#define ______________ int
#define _______________ for
#define ________________ while
#define _________________ inline 
#define __________________ return
#define ___________________ main
#define ____________________ for
#define _____________________ if
#define ______________________ sizeof
#define _______________________ using 
#define ________________________ namespace
#define _________________________ std 
#define __________________________ printf
#define ______________________________________________________ "%d\n"
_______________________ ________________________ _________________________;

______________ _____,________[__________],___[__________],____=-1,_;

_________________ ______________ __(______________ ___________________________,______________ ____________________________){
    __________________ ___________________________>____________________________?___________________________:____________________________;
}

______________ ___________________(){
    ____________(___________,&_);
    ________________(_--){
        ____=-1;
        ______________ ______=0;
        _____________(___,0,______________________(___));
        ____________(___________,&_____);
        ___[0]=1;
        ____________________(______________ _______=1;_______<=_____;_______++){
            ____________(___________,&________[_______]);
            ____=__(____,________[_______]);
        }
        ____________________(______________ _______=1;_______<=_____;_______++){
            ____________________(______________ _________=________[_______];_________<=____;_________++){
                _____________________(___[_________-________[_______]])___[_________]++;
            }
        }
        ____________________(______________ _______=1;_______<=_____;_______++){
            _____________________(___[________[_______]]>1){
                ______++;
            }
        }
        __________________________(______________________________________________________,_____-______);
    }
}

好吧他本來長這樣

#include<cstdio>
#include<cstring>
using namespace std;

int n,a[100005],dp[100005],maxx=-1;

inline int max(int x,int y){
    return x>y?x:y;
}

int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        maxx=-1;
        int ans=0;
        memset(dp,0,sizeof(dp));
        scanf("%d",&n);
        dp[0]=1;
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
            maxx=max(maxx,a[i]);
        }
        for(int i=1;i<=n;i++){
            for(int j=a[i];j<=maxx;j++){
                if(dp[j-a[i]])dp[j]++;
            }
        }
        for(int i=1;i<=n;i++){
            if(dp[a[i]]>1){
                ans++;
            }
        }
        printf("%d\n",n-ans);
    }
}
  • 根據題意,如果某一種面額可以被其他錢幣拼湊而成,那麽它就可以舍去。

  • 先dp出無窮多錢幣可以拼湊出的錢幣種類(小於最大面額即可)。如果一種錢數j可以被拼湊出,我們令dp[j]=1.

  • 然後枚舉提供的每種面額,如果dp值為1,那麽ans(可以被舍去的面額的數量)++。

  • 最後輸出n-ans即可。

//然而考試的時候我完全背包打錯了O_O驚嚇,結果居然強勢AC O_O

洛谷 P5020 【貨幣系統】