装箱I(01背包)

描述

给两个有一定容量的箱子,往里面装宝石(宝石总容量不能超过箱子容量),不同的宝石有不同的容量和价值。求两个箱子里最大宝石的价值。

输入

line 1: Input n;  n:表示宝石数量    1<n<100
line 2: Input C1,C2;   C1:第一个箱子的容量  C2:第二个箱子的容量  1<C1,c2<100
line 3~n+3-1: Ci,Vi   Ci:宝石容量  Vi:宝石价值 
计算后的算有数据都在2^31内.

输出

两个箱子里的宝石的最大价值。

样例输入

4
10 20
5 20
11 15
6 8
8 9
6
10 20
6 8
4 15
8 9
4 16
15 20
3 15

样例输出

44
66

题目分析:

01背包,多开一维。

 

#include <bits/stdc++.h>
using namespace std;
int dp[105][105],w[105],v[105];
int main()
{
    int n,c1,c2;
    while(~scanf("%d",&n))
    {
        memset(dp,0,sizeof dp);
        scanf("%d%d",&c1,&c2);
        for(int i=1;i<=n;i++)
            scanf("%d%d",&w[i],&v[i]);
        for(int i=1;i<=n;i++)
            for(int j=c1;j>=0;j--)
                for(int k=c2;k>=0;k--)
                {
                    if(j>=w[i]) dp[j][k]=max(dp[j][k],dp[j-w[i]][k]+v[i]);
                    if(k>=w[i]) dp[j][k]=max(dp[j][k],dp[j][k-w[i]]+v[i]);
                }
        printf("%d\n",dp[c1][c2]);
    }
    return 0;
}

 

posted @ 2018-08-19 08:11  zdragon  阅读(287)  评论(0编辑  收藏  举报