2021蓝桥杯省赛C++F题个人题解
先上题面吧。
根据题意,砝码可以放在天平左边和右边。
有点类似01背包问题。
大家初中的时候就知道天平是左物右码。
这题用DP来做应该就可以了,分三种情况考虑:
- 不放
- 放在左边
- 放在右边
#include<bits/stdc++.h>
using namespace std;
#define speed ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
int dp[105][100005],a[105],ans[100005],cnt;
int main()
{
speed;
int n,sum0=0;
cin>>n;
for (int i=1;i<=n;++i){
cin>>a[i];
sum0+=a[i];
}
dp[0][0]=1;
for (int i=1;i<=n;++i){
for (int j=0;j<=sum0;++j){
if(dp[i-1][j]){
dp[i][j]=1;//不放
dp[i][j+a[i]]=1;//放在右边
dp[i][abs(j-a[i])]=1;//在已经达到的质量的基础上减去某一物品质量,相当于放在左边
}
}
}
for (int i=1;i<=n;++i){
for (int j=0;j<=sum0;++j){
if(dp[i][j]){
ans[j]=j;//若能达到某个质量j,就记录
}
}
}
for (int i=1;i<=sum0;++i){
if(ans[i]){
cnt++;
}
}
cout<<cnt<<endl;
return 0;
}
如果有错误,请指出,本人蒟蒻QWQ。