zoukankan      html  css  js  c++  java
  • hdu 2844 Coins (多重背包)

    题意是给你几个数,再给你这几个数的可以用的个数,然后随机找几个数来累加,


    让我算可以累加得到的数的种数!


    解题思路:先将背包初始化为-1,再用多重背包计算,最后检索,若bb[i]==i,则说明i这个数是可以得到的!一个循环计算可以达到的数的个数,最后输出就好了!


    #include<stdio.h>

    #define max(a,b) a>b?a:b


    int bb[500000];
    int vv;


    void shun(int cost,int weight)
    {
    int i;
    for(i=cost;i<=vv;i++)
    bb[i]=max(bb[i],bb[i-cost]+weight);
    }


    void ni(int cost,int weight)
    {
    int i;
    for(i=vv;i>=cost;i--)
    bb[i]=max(bb[i],bb[i-cost]+weight);
    }


    int main()
    {
    int n,i,k,v[5000],amount[5000],ans;
    while(scanf("%d%d",&n,&vv),n+vv)
    {
    for(i=1;i<=vv;i++)
    bb[i]=-1;
    for(i=0;i<n;i++)
    scanf("%d",&v[i]);
    for(i=0;i<n;i++)
    scanf("%d",&amount[i]);
    for(i=0;i<n;i++)
    {
    if(amount[i]*v[i]>=vv)
    shun(v[i],v[i]);
    else
    {
    k=1;
    while(k<amount[i])
    {
    ni(k*v[i],k*v[i]);
    amount[i]-=k;
    k*=2;
    }
    ni(amount[i]*v[i],amount[i]*v[i]);
    }
    }
    ans=0;
    for(i=1;i<=vv;i++)
    if(bb[i]==i)
    ans++;
    printf("%d ",ans);
    }
    return 0;

    }

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2844

  • 相关阅读:
    信息收集与扫描
    流密码
    信息安全面临的威胁
    .net core Web应用启动类
    .net core 1.0 Web MVC 自定义认证过程
    彻底脱离循环与结束当下循环
    Java多线程:Thread中的实例方法
    memcached安装问题
    五月的仓颉
    json时间格式化方法
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3235646.html
Copyright © 2011-2022 走看看