洛谷 P1441 砝码称重

题目描述

现有n个砝码,重量分别为a1,a2,a3,……,an,在去掉m个砝码后,问最多能称量出多少不同的重量(不包括0)。

输入输出格式

输入格式:

输入文件weight.in的第1行为有两个整数n和m,用空格分隔

第2行有n个正整数a1,a2,a3,……,an,表示每个砝码的重量。

输出格式:

输出文件weight.out仅包括1个整数,为最多能称量出的重量。

输入输出样例

输入样例#1: 复制
3 1
1 2 2
输出样例#1: 复制
3

说明

【样例说明】

在去掉一个重量为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\n",ans);
44     return 0;
45 }

猜你喜欢

转载自www.cnblogs.com/rlt1296/p/9342660.html