P1441 砝码称重(dfs)


要注意sum+a[i]的位置,我放错了,不知道为什么会re

#include<iostream>
#include<cstring>
#define int long long
using namespace std;
int n,m,ans,a[30],vis[2020];
int f[2020];
int maxs;
void check(){
    int sum=0;
    vis[0]=1;
    for(int i=1;i<=n;i++){
        if(f[i])continue;
        for(int j=sum;j>=0;j--){
            if(vis[j]&&!vis[j+a[i]])vis[j+a[i]]=1,ans++;
        }
        sum+=a[i];
    }
}
void dfs(int pos,int num){
    if(num==m){
        memset(vis,0,sizeof(vis));
        ans=0;
        check();
        maxs=max(maxs,ans);
        return;
    }
    for(int i=pos;i<=n;i++){
        f[i]=1;
        dfs(i+1,num+1);
        f[i]=0;
    }
}
signed main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++)cin>>a[i];
    dfs(1,0);
    cout<<maxs;
    return 0;
}
posted @ 2025-02-16 16:54  郭轩均  阅读(12)  评论(0)    收藏  举报