• M-dp基础


    这是一道模板题,然后看书查资料,基本上就是可以直接抄模板,记得建立相应的数据就好。

    http://blog.sina.com.cn/s/blog_8cf6e8d90100zldn.html这是一个关于背包问题的讲解,可以找时间看一下。

    #include<iostream>
    #include<cmath>
    #include<cstring>
    using namespace std;
    int d[1005][1005],m[1005],v[1005];
    int main()
    {
        int n,N,V,ans=0;
        cin>>n;
        while(n--)
        {
            cin>>N>>V;
            for(int i=1;i<=N;i++)
                cin>>m[i];
            for(int i=1;i<=N;i++)
                cin>>v[i];
            memset(d,0,sizeof(d));
            for(int i=1;i<=N;i++)
                for(int j=0;j<=V;j++)
                {
                    if(v[i]<=j&&d[i-1][j]<d[i-1][j-v[i]]+m[i])
                        d[i][j]=d[i-1][j-v[i]]+m[i];
                    else
                        d[i][j]=d[i-1][j];
                }
                cout<<d[N][V]<<endl;
        }
        return 0;
    }
    
    #include<stdio.h>
    02
     #include<stdlib.h>
    03
     #include<string.h>
    04
     #define N 1001
    05
     int dp[N];
    06
     int c[N],w[N];
    07
     int max(int x,int y)
    08
     {
    09
         return x>y?x:y;
    10
     }
    11
     int main()
    12
     {
    13
         int t,n,v,i,j;
    14
         scanf("%d",&t);
    15
         while(t--)
    16
         {
    17
             scanf("%d%d",&n,&v);
    18
             for(i=0;i<n;i++)
    19
               scanf("%d",&c[i]);
    20
             for(i=0;i<n;i++)
    21
               scanf("%d",&w[i]);
    22
             memset(dp,0,sizeof(dp));
    23
             for(i=0;i<n;i++)
    24
             {
    25
                 for(j=v;j>=w[i];j--)
    26
                   dp[j]=max(dp[j],dp[j-w[i]]+c[i]);
    27
             }
    28
             printf("%d
    ",dp[v]);
    29
         }
    30
         system("pause");
    31
         return 0;
    32
     }
     
    
     
    
    代码如下:二维的。。。不太习惯。。。不建议用
    
    view source
    01
    //二维数组实现01背包
    02
     #include <iostream>
    03
     #include <algorithm>
    04
     using namespace std;
    05
     int dp[1001][1001],vol[1001],val[1001];
    06
     int main()
    07
     {
    08
         int t,n,i,j,v;
    09
         cin>>t;
    10
         while(t--)
    11
         {
    12
             cin>>n>>v;
    13
             for(i=1;i<=n;i++)
    14
                 scanf("%d",&val[i]);
    15
             for(i=1;i<=n;i++)
    16
                 scanf("%d",&vol[i]);
    17
             memset(dp,0,sizeof(dp)); //初始化
    18
             for(i=1;i<=n;i++)
    19
                 for(j=0;j<=v;j++) //注意要从0开始,这个题测试数据有点变态,有的骨头有价值,但占的空间是0
    20
                 {
    21
                     if(vol[i]<=j && dp[i-1][j]<dp[i-1][j-vol[i]]+val[i])
    22
                         dp[i][j]=dp[i-1][j-vol[i]]+val[i];
    23
                     else
    24
                         dp[i][j]=dp[i-1][j];
    25
                 }
    26
             cout<<dp[n][v]<<endl;
    27
         }
    28
         return 0;
    29
     }
    

      

      

  • 相关阅读:
    info命令简介
    scheme代码返回3个数中较大2个数之和
    mitscheme的标准库函数
    如何理解认知
    mitscheme编辑和装入程序文件
    scheme格式化输出字符串
    SQLServer中批量导出所有作业或链接脚本
    DAMA学习笔记(1)
    SQLServer AlwaysON修改可用性组的监听端口
    SQLServer将数据库置为只读
  • 原文地址:https://www.cnblogs.com/yintoki/p/5733341.html
Copyright © 2020-2023  润新知