题目描述
现有n个砝码,重量分别为a1,a2,a3,……,an,在去掉m个砝码后,问最多能称量出多少不同的重量(不包括0)。
输入输出格式
输入格式:
输入文件weight.in的第1行为有两个整数n和m,用空格分隔
第2行有n个正整数a1,a2,a3,……,an,表示每个砝码的重量。
输出格式:
输出文件weight.out仅包括1个整数,为最多能称量出的重量。
输入输出样例
说明
【样例说明】
在去掉一个重量为2的砝码后,能称量出1,2,3共3种重量。
【数据规模】
对于20%的数据,m=0;
对于50%的数据,m≤1;
对于50%的数据,n≤10;
对于100%的数据,n≤20,m≤4,m<n,ai≤100。
看到数据不大,想到搜索,搜索去掉的砝码,计算可以称量的重量就是一个01背包。
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 using namespace std; 5 int n,m,ans,s,a[25],b[25],f[2005]; 6 void dp() 7 { 8 memset(f,0,sizeof(f)); 9 f[0]=1; 10 for(int i=1;i<=n;i++) 11 if(!b[i]) 12 for(int j=s;j>=a[i];j--) 13 f[j]|=f[j-a[i]]; 14 int sum=0; 15 for(int i=1;i<=s;i++) 16 if(f[i]) 17 sum++; 18 ans=max(ans,sum); 19 } 20 void dfs(int s,int num) 21 { 22 if(num>m) 23 { 24 dp(); 25 return; 26 } 27 for(int i=s;i<=n;i++) 28 { 29 b[i]=1; 30 dfs(i+1,num+1); 31 b[i]=0; 32 } 33 } 34 int main() 35 { 36 scanf("%d%d",&n,&m); 37 for(int i=1;i<=n;i++) 38 { 39 scanf("%d",a+i); 40 s+=a[i]; 41 } 42 dfs(1,1); 43 printf("%d ",ans); 44 return 0; 45 }