题目:注意理解题意,去掉m个之后,最大值,不是去掉所有可能的m个之后,所有结果的和,
分析:题解说先dfs枚举再dp,
哦,原来就是先dfs出所有可能的情况,然后再对每种情况进行其可能的重量统计。
很有道理的两种dfs:
代码:
#include<bits/stdc++.h>
using namespace std;
int m,n;
int A[25];
int B[25];
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];
}
return S.count() - 1;
}
bool f(int n1,int 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;
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);
cout<<maxx;
}
if(f(n1,i+1)==0) return 0; 这里剪枝为什么出错呢?