hdu 1574 RP问题 01背包的变形

hdu 1574 RP问题

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1574

分析:01背包的变形。

RP可能为负,所以这里分两种情况处理一下就好。

初始化要注意。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define inf 0x3f3f3f3f

int f[20001],th;
int a,b,c;

void dp()
{

    f[10000]=0;
    if(a>0)
    {
        for(int i=b+10000;i>=0;i--)
            f[i+a]=max(f[i+a],f[i]+c);
    }
    else if(a<0)
    {
        for(int i=b+10000;i<20001;i++)
            f[i+a]=max(f[i+a],f[i]+c);
    }
}

int main()
{
    int t,maxx;
    scanf("%d",&t);
    while(t--)
    {
        maxx=-inf;
        memset(f,-inf,sizeof(f));
        scanf("%d",&th);
        for(int i=1;i<=th;i++)
        {
            scanf("%d%d%d",&a,&b,&c);
            dp();
        }
        for(int i=0;i<20001;i++)
            maxx=max(maxx,f[i]);
        printf("%d
",maxx);
    }
    return 0;
}

//晕死,又因为初始化位置放错了找错误找半天!

 疑问:

初学动态规划,一般是求解是从当前状态由前一个状态得来。一开始我就是这样写状态转移方程的。然而这一个题是当前状态求解下一个状态。

所以对于两者之间,有点困惑,大神求教!

原文地址:https://www.cnblogs.com/yang-/p/4732759.html