题目描述
现有n个砝码,重量分别为a1,a2,a3,……,an,在去掉m个砝码后,问最多能称量出多少不同的重量(不包括0)。
输入输出格式
输入格式:
输入文件weight.in的第1行为有两个整数n和m,用空格分隔
第2行有n个正整数a1,a2,a3,……,an,表示每个砝码的重量。
输出格式:
输出文件weight.out仅包括1个整数,为最多能称量出的重量。
思路:
dfs遍历每一种情况
dp找出每一种情况最多能称出多少种重量
输出称出最多的重量
Over
代码解释:
#include<iostream>
#include<cstring>
using namespace std;
int n,m,a[100],ans,temp,tot;
bool f[2008],v[100];
void dp()
{
memset(f,0,sizeof(f));
f[0]=1,temp=0,tot=0;
for(int i=1;i<=n;i++)
if(v[i]==0)
{
for(int l=tot;l>=0;l--)
{
if(f[l]==1&&f[l+a[i]]==0)
f[l+a[i]]=1,temp++;
}
tot+=a[i];
}
ans=max(temp,ans);
}
void dfs(int x,int y)
{
if(x>n+1||y>m+1)return ;
if(x==n+1&&y==m+1){dp();return ;}
dfs(x+1,y);
v[x]=1;
dfs(x+1,y+1);
v[x]=0;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>a[i];
dfs(0,0);
cout<<ans;
return 0;
}
改天把注释补上QAQ