砝码称重()

//DP背包问题  
// f[i][j] 集合:从前i个物品中选,总重量为J的所有方案
// 属性 bool类型 是否存在 
#include
using namespace std;
const int N=110,M=210000,B=M/2;//B是偏移量
bool f[N][M];
int w[N];
int main()
{
    int n;cin>>n;
    int m=0;
    for(int i=1;i<=n;i++) cin>>w[i],m+=w[i];
    f[0][B]=true;
    for(int i=1;i<=n;i++)
    {
        for(int j=-m;j<=m;j++)
        {
            f[i][j+B]=f[i-1][j+B];//不选
            if(j+w[i]<=m) f[i][j+B]|=f[i-1][j+w[i]+B];//选w[i]差
            if(j-w[i]>=-m) f[i][j+B]|=f[i-1][j-w[i]+B];//选w[i]和
        }
    }
    int sum=0;
    for(int j=1;j<=m;j++)
    if(f[n][j+B])sum++;
    cout<

你可能感兴趣的:(算法,c++,数据结构)