正题
第五题:砝码称重
可以不用加优化。取走k个点之后,用01背包算一下有多少种状态即可。
#include<cstdio>
#include<cstdlib>
#include<cstring>
int n,m;
int a[25];
int max=0;
bool tf[2010];
bool we[2010];
bool f[2010];
int tot=0;
int dp(){
memset(f,false,sizeof(f));f[0]=true;
int ans=0;
tot=0;
for(int i=1;i<=n;i++){
if(tf[i]) continue;
for(int j=tot;j>=0;j--) if(f[j]==true && f[j+a[i]]==false) {ans++;f[j+a[i]]=true;}
tot+=a[i];
}
return ans;
}
void dfs(int x,int t){
if(t==m){
memset(we,false,sizeof(we));
if(dp()>max) max=dp();
return ;
}
if(x==n+1) return ;
dfs(x+1,t);
tf[x]=true;
dfs(x+1,t+1);
tf[x]=false;
}
int main(){
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
dfs(1,0);
printf("%d",max);
}