悬关60分求救
  • 板块P1441 砝码称重
  • 楼主hexz01
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/3/1 19:46
  • 上次更新2024/3/1 21:28:53
查看原帖
悬关60分求救
727076
hexz01楼主2024/3/1 19:46
#include <iostream>
using namespace std;
int n, m, ans=0;
int a[27];
bool f[27];
bool dp[27][2007];
int dpans(){
    for(int i=0;i<=n;i++)
        for(int j=0;j<=2000;j++)
            dp[i][j]=0;
    for(int i=0;i<=n;i++)
        dp[i][0]=1;
    int T=0;
    for(int i=1;i<=n;i++){
        if(!f[i]){
            T+=a[i];
            for(int j=1;j<=T;j++)
                dp[i][j]=(dp[i-1][j-a[i]] || dp[i-1][j]);
        }else{
            for(int j=1;j<=T;j++)
                dp[i][j]=dp[i-1][j];
        }
    }
    int max1=0;
    cout<<"选择:";
    for(int i=1;i<=n;i++)
        if(!f[i])
            cout<<a[i]<<" ";
    cout<<endl;
    for(int i=1;i<=n;i++){
        for(int j=0;j<=T;j++)
            cout<<dp[i][j]<<" ";
        cout<<endl;
    }
    cout<<"----"<<endl;
    for(int j=1;j<=T;j++)
        max1+=dp[n][j];
    return max1;
}
void dfs(int now, int cnt){
    if(now>n){
        if(cnt==m)
            ans=max(ans, dpans());
        return;
    }
    dfs(now+1, cnt);
    f[now]=1;
    dfs(now+1, cnt+1);
    f[now]=0;
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    dfs(1, 0);
    cout<<ans<<endl;
    return 0;
}

#4 #7 #8 #10 WA

2024/3/1 19:46
加载中...