您的位置:首页 > 其它

luogu1441砝码称重(深搜+背包:组合数+01背包)

2018-04-02 15:35 211 查看
题目连接
#同类的题目还有这些#
题目大意:
    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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  深搜 01背包