0
点赞
收藏
分享

微信扫一扫

美团3.19 笔试 背包

悲催博士僧 2022-03-19 阅读 59
c++
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <math.h>
#include <bitset>
#include <algorithm>
#include <climits>
using namespace std;
const int N=1e5+10;
const int mod=998244353;
#define int long long 
int n,dp[N][105],a[N],k,k2,maxi[105];
int _gcd(int x,int y){
	if(y==0) return x;
	else return _gcd(y,x%y);
}
int32_t main(){
    scanf("%lld%lld%lld",&n,&k,&k2);
    for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
    int p=(k*k2)/_gcd(k,k2);
	for(int i=0;i<p;i++) maxi[i]=-1e18; 
	// dp[0][0]=1;
    for(int i=1;i<=n;i++){
		int now2=(a[i]%p+p)%p;
		for(int j=0;j<p;j++) dp[i][j]=dp[i-1][j];
		for(int j=1;j<p;j++){
			int now=(j+a[i]%p+p)%p;
			if(maxi[j]!=-1e18){
				maxi[now]=maxi[j]+a[i];
			}
			dp[i][now]=(dp[i][now]+dp[i-1][j])%mod;
		}
		dp[i][now2]++;
		if(maxi[now2]==-1e18) maxi[now2]=now2;
    	for(int j=0;j<p;j++){
    		cout<<dp[i][j]<<" ";
    	}cout<<endl;
    }
    int ans=0,res=0;
    for(int i=1;i<p;i++){
    	if(i%k==0&&i%k2!=0&&dp[n][i]){
    		ans=dp[n][i];res=i;
    	}
    }
    cout<<maxi[res]<<" "<<ans<<endl;
    
}

举报

相关推荐

0 条评论