zoukankan      html  css  js  c++  java
  • 2546 ACM 01背包

    题目http://acm.hdu.edu.cn/showproblem.php?pid=2546

    思路:再01背包的问题上稍作修改
    如何满足 :卡上的剩余金额大于或等于5元,就一定可以购买成功(即使购买后卡上余额为负),否则无法购买(即使金额足够)?并使得余额最少?
    找到最贵的菜,卡上的剩余金额大于或等于5元,必然要买下它,先让容量-5再进入01背包循环,找到dp[容量-5](存的是该容量下,最大的价值)。
    用了swap函数来找最贵的菜,所以用的C++头文件。
    这是回家耍了6天后的第一个ACM题目,故意找的一个稍微熟悉又不白痴的算法,好久没一次过,开心。

    #include<stdio.h>
    #include<iostream>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    
    #define max(a,b) a>b?a:b
    
    int main()
    {
        int n,cost[1100],weight[1100],va,v,dp[1100];
        while(scanf("%d",&n)!=EOF&&n!=0)
        {
            for(int i=0;i<n;i++)
            {
                scanf("%d",&cost[i]);
                if(cost[i]>cost[0])
                    swap(cost[i],cost[0]);
                weight[i]=cost[i];
            }
            scanf("%d",&va);
            if(va<5)
                printf("%d
    ",va);
            else
            {
                v=va-5;
                memset(dp,0,sizeof(dp));
                for(int i=1;i<n;i++)
                for(int j=v;j>=weight[i];j--)
                    dp[j]=max(dp[j],dp[j-weight[i]]+cost[i]);
                printf("%d
    ",va-dp[v]-cost[0]);
            }
    
        }
    }
  • 相关阅读:
    【日语】日语学习计划(转载)
    【日语】日语商务情景口语
    Nop常用知识点
    c#版在pc端发起微信扫码支付
    nopcommerce 常用属性验证
    @codeforces
    @codeforces
    @codeforces
    @codeforces
    @codeforces
  • 原文地址:https://www.cnblogs.com/CheeseIce/p/9588679.html
Copyright © 2011-2022 走看看