题目大意:
https://www.luogu.org/problemnew/show/P1417
看第一份方法的公式
排序后01背包
#include <bits/stdc++.h> #define ll long long using namespace std; struct NODE { ll a,b,c; }no[55]; bool cmp(NODE &p,NODE &q) { return p.b*q.c>p.c*q.b; } ll dp[100005]; int main() { int t,n; while(~scanf("%d%d",&t,&n)) { for(int i=0;i<n;i++) scanf("%lld",&no[i].a); for(int i=0;i<n;i++) scanf("%lld",&no[i].b); for(int i=0;i<n;i++) scanf("%lld",&no[i].c); sort(no,no+n,cmp); for(int i=0;i<n;i++) for(int j=t;j>=no[i].c;j--) dp[j]=max(dp[j],dp[j-no[i].c]+(no[i].a-j*no[i].b)); ll ans=0; for(int i=0;i<=t;i++) ans=max(ans,dp[i]); printf("%lld ",ans); } return 0; }