杭电3469---简单二维背包!!

http://http://acm.hdu.edu.cn/showproblem.php?pid=3496

题目意思:某人去店里买东西,买DVD。首先由测试数据,接下来是有你,n,m,l,的数据,n表示有某人想买n 个DVD,m表示:有M个店会买这个DVD,l表示:总给出l的时间去买DVD。就下来就有n行,分别有x,y,两个个数据。x表示:买一个DVD 需花的时间,Y表示:买这个DVD所需要花的钱。。题目问某人一共需要多少钱?在花完这些时间和m个店里共要花费多少钱??

思路:很明显首先可以想到的就是背包问题。其次这并非一般的01背包。在通过看题目可以得出因为有时间 与店的个数所限制。因此最少需要二维来确定。。显然01背包不能够解决它,,但是可以在一维背包上稍加变化即可得出,,动态方程。。若懂得01背包,这问题就不大,,自己想下吧!!(我做的时候就错了好多次,(一直总是格式错误)还郁闷。其实就是数组开小了,没看清题目。。注意审题很关键。。)

好吧!讲了这磨多,具体见代码吧!!

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm >
#include<cstdlib>
using namespace std;
const int maxn=1005;
int dp[maxn][maxn];
int time[maxn];
int val[maxn];
int n,m, l;
int main()
{
    int i,j,k,t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d%d",&n,&m,&l);
        for(i=0;i<n;i++)
        {
            scanf("%d%d",&time[i],&val[i]);
        }
        memset(dp,-1,sizeof(dp));//注意初始化。有时dp[0][0]不一定等于0,因具体分析各个题目。。不可盲目。
        dp[0][0]=0;
        for(i=0;i<n;i++)
        {
            for(j=m;j>=1;j--)//这里要注意下,不能j>=0,因为当等于1时,就该停止循环了。。容易错。。
            {
                for(k=l;k>=time[i];k--)
                {
                    if(dp[j-1][k-time[i]]!=-1)
                    {
                        dp[j][k]=max(dp[j][k],dp[j-1][k-time[i]]+val[i]);
                    }

                }
            }
        }
        int min=0;
        for(i=1;i<=l;i++)
        {
            if(min<dp[m][i])
            {
                 min=dp[m][i];
            }

        }
        printf("%d\n",min);
    }
    return 0;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值