luogu_1441 砝码称重

#include <bits/stdc++.h>
using namespace std;
int n,m,a[30],ans;
bool use[30],t[2010];

void dfs(int now,int cnt){
	if(now==m){
		memset(t,0,sizeof(t));
		int sum=0,tot=0; t[0]=1;
		for(int i=1;i<=n;i++)if(!use[i]){
			for(int j=tot;j>=0;j--)if(t[j] && !t[j+a[i]])t[j+a[i]]=1,sum++;
			tot+=a[i];
		}
		ans=max(ans,sum);
		return;
	}
	for(int i=cnt+1;i<=n;i++)if(!use[i]){
		use[i]=1;
		dfs(now+1,i);
		use[i]=0;
	}
}

int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)scanf("%d",&a[i]);
	dfs(0,0);
	printf("%d
",ans);
	return 0;
}

  

原文地址:https://www.cnblogs.com/codetogether/p/9780284.html