标签:
题目链接: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; }
标签:
原文地址:http://www.cnblogs.com/zhanyage110/p/4287307.html