已退役


私信TA

用户名:15893197790

访问量:14398

签 名:

努力学习,积极生活。

等  级
排  名 389
经  验 5119
参赛次数 0
文章发表 43
年  龄 0
在职情况 学生
学  校 南京大学
专  业 计算机科学与技术

  自我简介:

已退役。研究生方向为AI+软件工程,欢迎学术交流!

TA的其他文章

解题思路:

注意事项:

参考代码:

#include<bits/stdc++.h>//一维dp,思路是

//把每个砝码拆成一正一反两个质量,这样所有砝码都只需要放左边就行了。

using namespace std;

#define maxw 100010

#define maxn 110

int n;

int sum=0;

int a[maxn<<1];

int dp[maxw];

void init(){

    memset(a,0,sizeof(a));

}

void debug(){

    for(int i=1;i<=sum;i++){

        printf("%d ",dp[i]);

    }putchar('\n');

}

int main(){

    init();

    scanf("%d",&n);

    for(int i=1;i<=n;i++){

        scanf("%d",&a[i]);

        sum+=a[i];

    }

    for(int i=n+1;i<=n*2;i++){

        a[i]=-a[i-n];

    }

    dp[0]=1;

    for(int i=1;i<=n;i++){

        for(int j=sum;j>=0;j--){

            if(dp[j]==1&&j+a[i]>0){

                dp[j+a[i]]=1;

            }

        }

        //debug();

    }

    for(int i=n+1;i<=2*n;i++){

        for(int j=0;j<=sum;j++){

            if(dp[j]==1&&j+a[i]>0){

                dp[j+a[i]]=1;

            }

        }

        //debug();

    }

    //debug();

    int ans=0;

    for(int i=1;i<=sum;i++){

        if(dp[i])ans++;

    }

    printf("%d",ans);

    return 0;

}


 

0.0分

1 人评分

  评论区

  • «
  • »