题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=747

来看思路:这题很明显需要用到背包 而且是个01背包。但是需要进行各预处理。

我们先要进行一下贪心这个贪心怎么来得呢 先看一个式子:a1-b1c1+a2-(c1+c2)b2 > a2-b2c2+a1-(c1+c2)b1

化简之后是:b2c1<b1c2所以用这个式子进行贪心就可以了

然后需要注意的是背包地方有两个细节:背包不一定装满然后还有一个再代码里面 我再解释

下面看代码:

#include<cstdio>
#include<math.h>
#include<algorithm>
#include<string.h>
#include<iostream>

using namespace std;

struct node
{
    int a,b,c;
}p[100005];
int dp[100010];
bool cmp(node x,node y)
{
    return x.b*y.c > x.c*y.b;
}

int main()

{
    int T,t,n,i,j,ans = 0;
    while(~scanf("%d%d",&T,&n))
    {
        for(i = 0;i < n;i++)
        {
            scanf("%d %d %d",&p[i].a,&p[i].b,&p[i].c);
        }
        sort(p,p + n,cmp);
        memset(dp,0,sizeof(dp));
        for(i = 0;i < n;i++)
        {
            for(j = min(T,p[i].a/p[i].b);j >= p[i].c;j--) //这个地方的j一定要用两者直接最小的
            {
                dp[j] = max(dp[j],dp[j-p[i].c]+p[i].a-j*p[i].b);
                if(dp[j] > ans){ans = dp[j];}  //这个地方是为了防止背包不装满的时候用得
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}