砝码称重

using namespace std;
const int N = 1e5 + 10;
int w[N];
bool f[110][N * 2];//f[i][j]表示第i个物品,重量为j
int n, m;
int main()
{
    int n;
    cin >>n;
    for(int i = 1; i <= n ; i ++)cin >> w[i], m += w[i];
    f[0][N] = true;
    for(int i = 1; i <= n; i ++)
    {
        for(int j = -m; j <= m ; j ++)//从-m开始是因为我们要算砝码在不同位置的所有情况,极限情况下都放在左边
        {
            //不放第i个砝码
            f[i][j + N] = f[i - 1][j + N];
            //把这个砝码加到左边
            if(j - w[i] >= -m){
                f[i][j + N] |= f[i - 1][j - w[i] + N];
            }
            //把这个砝码放在右边
            if(j + w[i] <= m)
            {
                 f[i][j + N] |= f[i - 1][j + w[i] + N];
            }
        }
    }
    int ans = 0;
    for(int i = 1; i <= m; i ++)//从1开始,所有上面从-m开始也是无所谓的
    {
        if(f[n][i + N]){
            ans ++;
            cout << i << endl;
        }
    }
    cout << ans << endl;
}
全部评论

相关推荐

程序员猪皮:看不到八股什么意思
点赞 评论 收藏
分享
评论
1
收藏
分享
牛客网
牛客企业服务