原文链接:https://www.luogu.com.cn/problem/P1441
AC代码:
#include<iostream>
#include<string.h>
#include<vector>
#include<algorithm>
using namespace std;
int n,m,maxn=0,mapp[25],dp[2001],sum=0;
int visit[25];
vector<int> vec;
vector<int> con;
void deal(){
int i,j;
memset(mapp,0,sizeof(mapp));
memset(dp,0,sizeof(dp));
for(i=0;i<con.size();i++){
mapp[con[i]]=1;
}
dp[0]=1;
for(i=0;i<n;i++){
if(mapp[i]==1) continue;
for(j=sum;j>0;j--){
if(j>=vec[i]&&dp[j-vec[i]]!=0){
dp[j]=max(dp[j],dp[j-vec[i]]+1);
}
}
}
int num=0;
for(i=1;i<=sum;i++){
if(dp[i]>0){
num++;
//cout<<i<<endl;
}
}
maxn=max(maxn,num);
}
void dfs(int now){
int i,j;
if(con.size()==m){
//for(j=0;j<con.size();j++) cout<<con[j]<<endl;
deal();
return ;
}
for(i=now;i<n;i++){
if(visit[i]==1) continue;
visit[i]=1;
con.push_back(i);
dfs(i);
con.pop_back();
visit[i]=0;
}
}
int main(){
int i,j;
cin>>n>>m;
memset(visit,0,sizeof(visit));
for(i=0;i<n;i++){
cin>>j;sum+=j;
vec.push_back(j);
}
dfs(0);
cout<<maxn<<endl;
return 0;
}