洛谷:P1441 砝码称重(dp,)

题目:注意理解题意,去掉m个之后,最大值,不是去掉所有可能的m个之后,所有结果的和,

在这里插入图片描述

分析:题解说先dfs枚举再dp,

哦,原来就是先dfs出所有可能的情况,然后再对每种情况进行其可能的重量统计。

很有道理的两种dfs:

在这里插入图片描述

代码:

#include<bits/stdc++.h>
using namespace std;
int m,n;
int A[25];//原始重量 
int B[25];//是否被去掉  1表示被去掉了。
int maxx=-1;
int dp()
{
 bitset<9010> S;
 S[0] = 1;
 for(int i=0;i<m;i++)
 {
  if(B[i]==1) continue;
  S |= S << A[i];
 }
 //cout<<S.count();
 return S.count() - 1;
}
bool f(int n1,int cur)
{//要进行第n1个数的删除     表示cur的位置    
 if(n1==n){
  maxx=max(dp(),maxx);
  return 1;
 }
 if(cur==m) return 0;
 n1++; 
 int last=-1;
 for(int i=cur;i<m;i++) 
 {
  if(last==A[i]) continue;
  last=A[i];
  B[i]=1;
  //if(f(n1,i+1)==0) return 0; 
  f(n1,i+1);
  B[i]=0;
  } 
} 
int main()
{
 cin>>m>>n;
 for(int i=0;i<m;i++) cin>>A[i];
 memset(B,0,sizeof(B));
 f(0,0);
 //dp();
 cout<<maxx;
}

if(f(n1,i+1)==0) return 0; 这里剪枝为什么出错呢?

猜你喜欢

转载自blog.csdn.net/weixin_42721412/article/details/107671492