JD 1358:陈博的平均主义 && JD 1420:Jobdu MM分水果(01背包)

59 篇文章 0 订阅
12 篇文章 0 订阅


一堆数,分两拨,使得相差最少,当然是用01背包啦

OJ题目:click here~~

AC_CODE

const int inf = 1<<30 ;
int dp[98] ;
int sum ;
vector<int> x ;

void fun(int k){
    sum = 0 ;
    while(k){
        x.push_back(k%10) ;
        sum += (k%10) ;
        k /= 10 ;
    }
}

void DP(){
    int i , j ;
    memset(dp , 0 , sizeof(dp)) ;
    for(i = 0;i < x.size();i++){
        for(j = sum/2;j >= x[i];j--)
            dp[j] = max(dp[j] , dp[j - x[i]] + x[i]) ;
    }
}

int main(){
    int n , i , j , k , A , B ;
    //freopen("in.txt" , "r" , stdin) ;
    while(scanf("%d%d",&A,&B) != EOF){
        k = 0 ;
        for(i = A;i <= B;i++){
            x.clear() ;
            fun(i) ;
            if(x.size() == 1 || sum&1) continue ;
            DP() ;
            if(dp[sum/2] == sum/2) k++ ;
        }
        printf("%d\n",k) ;
    }
    return 0 ;
}



OJ题目: click here~~

AC_CODE

const int maxn = 108 ;
int dp[5000008] ;
int main(){
    int n , i , j , k , sum ;
    int x[maxn] ;
    //freopen("in.txt" , "r" , stdin) ;
    while(scanf("%d",&n) != EOF){
        sum = 0 ;
        memset(dp , 0 , sizeof(dp)) ;
        for(i = 0;i < n;i++){
            scanf("%d",&x[i]) ;
            sum += x[i] ;
        }
        for(i = 0;i < n;i++){
            for(j = sum/2;j >= x[i];j--)
                dp[j] = max(dp[j] , dp[j - x[i]] + x[i]) ;
        }
        printf("%d\n",abs(sum - 2*dp[sum/2])) ;
    }
    return 0 ;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值