题目大意:
n个砝码选其中m个,求他们能组合出来的重量最多。
解题思路(简单粗暴):
1 n个砝码选m个,吃果果的组合数,dfs搞起来
2 问m个砝码能组合出来的重量:01背包。
游戏结束(PS:深搜的参数意义,一定要搞懂,我WA了3次):
#include<cstdio>
#include<cstring>
int n,m,b[110],a[110],f[20010],mx=0,ans=0;
void dp()
{
memset(f,-1,sizeof(f));f[0]=1;
int su=0;
for(int i=1;i<=n;i++)
{
if(b[i]==0) continue;
int t=a[i];
for(int j=mx;j>=t;j--)
{
if(f[j-t]==1&&f[j]==-1)//第一次出现的格子,记录次数
{
su++;f[j]=1;
}
}
}
if(ans<su) ans=su;
}
void dfs(int x,int k) //当前是 x 个,选了 k 个
{
if(k==m)//选够了,去跑01背包
{
dp(); return ;
}
if(x>n) return ;
dfs(x+1,k);//不选当前点,直接去下一层
b[x]=1;//选当前点
dfs(x+1,k+1);
b[x]=0;
}
int main()
{
scanf("%d %d",&n,&m); m=n-m;
memset(b,0,sizeof(b));
for(int i=1;i<=n;i++) { scanf("%d",&a[i]); mx+=a[i]; }
dfs(1,0);
printf("%d",ans);
return 0;
}