题目地址:点这里
经典dp,dp[i][j] 代表用前i个物体可以组成重量为j的bool(>0 代笔存在方案)
代码:
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int dp[105][200];
int p[105];
int main()
{
int n;
cin>>n;
int sum=0;
for(int i=0;i<n;i++)
{
cin>>p[i];
p[i]/=100;
sum+=p[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];
if(j>=p[i-1]) dp[i][j]+=dp[i-1][j-p[i-1]];
}
if(sum%2==1)
{
cout<<"NO"<<endl;
}
else
{
if(dp[n][sum/2]) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
}

本文介绍了一种使用动态规划解决背包问题的经典方法。通过二维数组dp[i][j]记录使用前i个物品是否能组合成重量j的情况。适用于重量可整除的0/1背包问题。

1144

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



