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\n",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
 }

  

  

posted @ 2016-08-03 16:11  阿银家的小贰  阅读(283)  评论(0编辑  收藏  举报