zoukankan      html  css  js  c++  java
  • DP之背包问题详解及案例

    0-1背包

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

    #include <stdio.h>
    #include <string.h>
    #include <algorithm>
    #define MAX 10000
    
    using namespace std;
    
    int val[MAX];
    int w[MAX];
    int dp[MAX];
    
    int main()
    {
        int t;
        scanf("%d",&t);
        while(t--)
        {
            memset(dp,0,sizeof(dp));
            int n,W;
            scanf("%d%d",&n,&W);
    
            for(int i=0;i<n;i++)
                scanf("%d",&val[i]);
    
            for(int i=0;i<n;i++)
                scanf("%d",&w[i]);
    
            for(int i=0;i<n;i++)
            {
                for(int j=W;j>=w[i];j--)
                    if(dp[j-w[i]]+val[i]>dp[j])
                        dp[j]=dp[j-w[i]]+val[i];
            }
    
            printf("%d
    ",dp[W]);
        }
        return 0;
    }

    完全背包:

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

    #include <stdio.h>
    #include <string.h>
    #include <algorithm>
    #define MAX 10000
    #define INF 0x3f3f3f3f
    
    using namespace std;
    
    int dp[MAX];
    int val[MAX];
    int w[MAX];
    
    int main()
    {
        int t;
        scanf("%d",&t);
        while(t--)
        {
            memset(dp,INF,sizeof(dp));
            int W,m,k;
            scanf("%d%d",&m,&k);
            W=k-m;
    
            int n;
            scanf("%d",&n);
    
            for(int i=0;i<n;i++)
                scanf("%d%d",&val[i],&w[i]);
    
    
            dp[0]=0;
            for(int i=0;i<n;i++)
            {
                for(int j=w[i];j<=W;j++)
                {
                    dp[j]=min(dp[j],dp[j-w[i]]+val[i]);
                }
            }
            if(dp[W]==INF)
                printf("This is impossible.
    ");
            else
                printf("The minimum amount of money in the piggy-bank is %d.
    ",dp[W]);
    
        }
        return 0;
    }

    多重背包:http://acm.hdu.edu.cn/showproblem.php?pid=2191

    ///2191
    #include <stdio.h>
    #include <string.h>
    #include <algorithm>
    #define MAX 1000
    
    using namespace std;
    
    int dp[MAX];
    int val[MAX];
    int w[MAX];
    int num[MAX];
    
    int main()
    {
        int t;
        scanf("%d",&t);
    
        while(t--)
        {
            memset(dp,0,sizeof(dp));
    
            int W,n;
            scanf("%d%d",&W,&n);
    
            for(int i=0;i<n;i++)
                scanf("%d%d%d",&w[i],&val[i],&num[i]);
    
            for(int i=0;i<n;i++)
            {
                for(int j=0;j<num[i];j++)
                {
                    for(int k=W;k>=w[i];k--)
                        dp[k]=max(dp[k],dp[k-w[i]]+val[i]);
                }
            }
    
            printf("%d
    ",dp[W]);
    
        }
    
        return 0;
    }
  • 相关阅读:
    C# 产生JSON串
    JS JSON的一些操作
    这两天整合高德的一些功能
    图片压缩传输
    服务器远程调试
    Swagger的使用和部署
    Springcloud多模块整合mybatis-plus
    Spring Alibaba Nacos + Seata 1.4.0搭建使用
    java11开箱简评
    npm介绍及安装使用
  • 原文地址:https://www.cnblogs.com/TreeDream/p/5528292.html
Copyright © 2011-2022 走看看