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;
    }
  • 相关阅读:
    Eclipse的安装
    为Eclipse绑定Tomcat
    CHIL-SQL-快速参考
    CHIL-SQL-FORMAT() 函数
    CHIL-SQL-NOW() 函数
    CHIL-SQL-ROUND() 函数
    CHIL-SQL-LEN() 函数
    CHIL-SQL-MID() 函数
    【PAT A1060】Are They Equal
    vector
  • 原文地址:https://www.cnblogs.com/TreeDream/p/5528292.html
Copyright © 2011-2022 走看看