2240: Dragon's Collection 二维背包

本文介绍了一个经典的背包问题变种——在物品价值、体积及重量限制下求最大价值。通过动态规划算法实现,解决Arthur如何在负重和背包容量限制内选择最有价值的物品。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2240: Dragon's Collection


ResultTIME LimitMEMORY LimitRun TimesAC TimesJUDGE
5s8192K355130Standard

Arthur最终打败了Dragon, 获得了Dragon的所有收集品. 但不幸的是, 他的背包容量有限, 并且他的负重也有限. 因此他只能在不超过背包总容量和总重量限制的前提下选择最有价值的物品.

Input:

本题目包括多个Case。每个Case的第一行有3个数字, 依次是物品的个数n<20, 背包的总容量和最大的重量限制. 之后是n行数据, 每一行包括3个整数, 分别是此物品的价值, 大小和重量.

Output:

对于每一个Case, 输出在满足限制条件下能够获得的最大价值, 每个Case占据一行

Sample Input:

3 10 12
8 6 7
5 3 3
9 7 6

Sample Output:

14

 

Problem Source: skywind

#include<stdio.h>
int f[21][200][200];
int w[21],time[30],ver[30];
//f[i][v][u]=max{f[i-1][v][u],f[i-1][v-a[i]][u-b[i]]+w[i]}
int main()
{
    int n,t,v,i,j,k;
    while(scanf("%d%d%d",&n,&t,&v)==3)
    {
        for(i=0;i<n;i++) scanf("%d%d%d",&w[i],&time[i],&ver[i]);
        for(i=0;i<=t;i++) for(j=0;j<=v;j++)
        {
            if(time[0]<=i&&ver[0]<=j) f[0][i][j]=w[0];
            else f[0][i][j]=0;
        }
        for(i=1;i<n;i++)
            for(j=0;j<=t;j++)
                for(k=0;k<=v;k++)
                {
                    f[i][j][k]=f[i-1][j][k];
                    if(j>=time[i]&&k>=ver[i]&&f[i-1][j-time[i]][k-ver[i]]+w[i]>f[i][j][k])
                    {
                        f[i][j][k]=f[i-1][j-time[i]][k-ver[i]]+w[i];
                    }
                }
        printf("%d/n",f[n-1][t][v]);
    }
    return 0;
}

 

 

 

 

#include <iostream>
#include <algorithm>
using namespace std;

int n,m,p;
int dp[200][200];
int val[20],a[20],b[20];

int main()
{
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    int i,j,k,ca;
    while(scanf("%d%d%d",&n,&m,&p)!=-1)
    {
        for(i=0;i<n;i++)
        {
            scanf("%d%d%d",val+i,a+i,b+i);
        }
        memset(dp,0,sizeof(dp));
        for(i=0;i<n;i++)
           for(j=m;j>=0;j--)
              for(k=p;k>=0;k--)
              {
                  if(j-a[i]>=0 && k-b[i]>=0)
                  dp[j][k]=max(dp[j][k],dp[j-a[i]][k-b[i]]+val[i]);
              }
        printf("%d/n",dp[m][p]);
    }
    //system("pause");
    return 0;
}
/*
5 15 12
8 9 7
6 3 3
1 2 6
4 2 4
3 3 3

*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值