洛谷 P5020 【貨幣系統】
阿新 • • 發佈:2019-01-24
其他 一個 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 【貨幣系統】