洛谷 P5020 【货币系统】

本文深入讲解了完全背包问题的算法实现,通过一个AC代码示例,详细解释了如何使用动态规划解决完全背包问题,包括初始化DP数组、更新状态以及最终求解的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

"简" "单" 的完全背包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

转载于:https://www.cnblogs.com/Y15BeTa/p/luogu5020.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值