题目
现有nnn个砝码,重量分别为a1a_1a1,a2a_2a2,a3a_3a3,⋯\cdots⋯,ana_nan,在去掉mmm个砝码后,问最多能称量出多少不同的重量(不包括0)。
分析
可以用状压dp解决,当枚举的状态二进制下只有n−mn-mn−m个1时,那么统计能称出多少就行了
状态转移方程ans=max{bitset计算的1的个数}ans=max\{bitset计算的1的个数\}ans=max{bitset计算的1的个数}
代码
#include <cstdio>
#include <bitset>
#define rr register
#define max(a,b) (((a)>(b))?(a):(b))
using namespace std;
int n,m,w[20],ans;
signed cnt(int x){//统计二进制下1的个数
rr int ans=0;
for (rr int j=0;j<n;++j)
if (x&(1<<j)) ans++;
return ans;
}
signed main(){
scanf("%d%d",&n,&m);
for (rr int i=0;i<n;++i) scanf("%d",&w[i]);
for (rr int i=0;i<(1<<n);++i)
if (cnt(i)==n-m){
rr bitset<2010>so; so[0]=1;//首先0是可以通过的
for (rr int j=0;j<n;++j)
if (i&(1<<j)) so|=so<<w[j];//往左移的按位或值
ans=max(ans,so.count());
}
return !printf("%d",ans-1);//不包括0
}
本文探讨了使用状压动态规划方法解决在去除特定数量砝码后,能够称量的不同重量的最大数目问题。通过详细的算法分析和C++代码实现,展示了如何有效地计算在给定条件下可达到的重量组合。
654

被折叠的 条评论
为什么被折叠?



