• XTU1198:Candy(背包)


    版权声明:本文为博主原创文章。未经博主同意不得转载。 https://blog.csdn.net/libin56842/article/details/26182519

    题目描写叙述

    Henry和Lena近期买了非常多各种各样的糖…他们决定把全部糖分了… 可是两个人都不希望自己糖的总重量比对方少太多。 鉴于不同的糖的味道不尽同样,所以每一个糖都有一个yummy值。 Henry希望知道在两人得到的糖总质量差不大于m的时候,自己的糖yummy值之和的尽量大。

    输入

    有多组数据 每组数据第一行为两个整数。n,m,(1 <=n <= 100。 0 <= m <= 500) 接下来有两行,每行有n个数,第一行的第i个数表示第i颗糖的重量xi( 0 < xi <= 100), 第二行的第i个数表示第i颗糖的yummy值 yi( 0 < yi <= 100 )

    输出

    每行输出一组数据的结果, 一个数表示Henry的糖的总yummy值的最大值。假设不存在如题所述的分糖方案,输出-1

     

    例子输入

    1 30
    43
    15
    2 290
    89 22
    76 77
    

    例子输出

    -1
    153
    #include <stdio.h>
    #include <string.h>
    #include <algorithm>
    using namespace std;
    int wei[110],val[110],dp[10010];
    int main()
    {
        int n,m;
        while(scanf("%d%d",&n,&m)>0)
        {
            memset(dp,-1,sizeof(dp));
            int sum=0;
            for(int i=0; i<n; i++)
            {
                scanf("%d",&wei[i]);
                sum+=wei[i];
            }
            for(int i=0; i<n; i++)
                scanf("%d",&val[i]);
            dp[0]=0;
            int ans=0;
            for(int i=0; i<n; i++)
            {
                for(int j=sum; j>=wei[i]; j--)
                {
                    if(~dp[j-wei[i]])
                    {
                        dp[j]=max(dp[j],dp[j-wei[i]]+val[i]);
                        int ss=sum-j-j;
                        if(ss>=-m&&ss<=m) ans=max(ans,dp[j]);
                    }
                }
            }
            printf("%d
    ",ans?ans:-1);
        }
        return 0;
    }
    


    
                
  • 相关阅读:
    模板方法模式
    结构型模式
    组合模式
    享元模式
    [STL离散化]Skyscrapers的lower_bound系列
    [水]浙大校赛补题
    [数]来自亮亮OJ的五道数学题
    [数]被数学淹没不知所措
    [tour]2019HUST onsite签到
    [树组BIT]训练两题重新理解ver.
  • 原文地址:https://www.cnblogs.com/ldxsuanfa/p/9944619.html
Copyright © 2020-2023  润新知