#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e2+10,M=1e5+10;
int arr[N],dp[N][M];
int main()
{
//背包问题
//状态表示:dp[i][j]表示在以i个砝码位置结尾时,能否称出j重量
//dp[i][j]=dp[i-1][j]+dp[i-1][j+arr[i]]+dp[i-1][abs(j-arr[i])];
//1.没有加上i位置的砝码,就可以称出j重量,dp[i-1][j];
//2.加上i位置的砝码放在一边,可以称出j重量,dp[i-1][j+arr[i]];
//3.加上i位置的砝码,放在另一边,可以称出j重量,dp[i-1][abs(j-arr[i])];
int n=0;
cin>>n;
int sum=0;
for(int i=1;i<=n;i++)
{
cin>>arr[i];
sum+=arr[i];
}
dp[0][0]=1;
for(int i=1;i<=n;i++)
{
for(int j=0;j<=sum;j++)
{
dp[i][j]=dp[i-1][j]+dp[i-1][j+arr[i]]+dp[i-1][abs(j-arr[i])];
}
}
int ret=0;
for(int i=1;i<=sum;i++)
{
if(dp[n][i]) ret++;
}
cout<<ret;
return 0;
}
蓝桥杯——砝码称重(背包问题(动态规划(拿还是不拿)))
于 2024-04-10 01:41:03 首次发布
![](https://img-home.csdnimg.cn/images/20240709112858.png)