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。

扫描二维码关注公众号,回复: 115266 查看本文章

Solution:

  本题比较水,先搜索处理出删走$m$个砝码后的情况,再在剩下的$n-m$个砝码中跑$01$背包,处理出能秤出的重量,更新$ans$就$OK$了。

代码:

 1 #include<bits/stdc++.h>
 2 #define il inline
 3 #define ll long long
 4 #define Max(a,b) (a)>(b)?(a):(b)
 5 #define For(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
 6 #define Bor(i,a,b) for(int (i)=(b);(i)>=(a);(i)--)
 7 using namespace std;
 8 const int N=105;
 9 int n,m,f[N*16],a[N],ans,sum;
10 bool vis[N];
11 il void solve(){
12     sum=0;memset(f,0,sizeof(f));
13     f[0]=1;
14     For(i,1,n)
15     if(!vis[i])Bor(j,a[i],1600)
16         if(f[j-a[i]]&&!f[j])sum++,f[j]=1;
17     ans=Max(ans,sum);
18 }
19 il void dfs(int s,int k){
20     if(!s){solve();return;}
21     For(i,k,n) if(!vis[i])vis[i]=1,dfs(s-1,i),vis[i]=0;
22 }
23 int main(){
24     cin>>n>>m;
25     For(i,1,n)cin>>a[i];
26     dfs(m,1);
27     cout<<ans;
28     return 0;
29 }

猜你喜欢

转载自www.cnblogs.com/five20/p/8997301.html
今日推荐