稍微改了一点的01背包,选择的顺序会影响物品的价值,数学公式推一下可以得出cmp函数:
bool cmp(node x,node y) { return x.c*y.b<y.c*x.b; }
排序后跑一遍01就行
#include<cstdio> #include<algorithm> #define maxn 60 #define ll long long using namespace std; ll T,n,a[maxn],b[maxn],c[maxn]; struct node { ll a,b,c; }que[maxn]; bool cmp(node x,node y) { return x.c*y.b<y.c*x.b; } ll dp[100010]; int main() { scanf("%lld%lld",&T,&n); for(int i=1;i<=n;i++) scanf("%lld",&que[i].a); for(int i=1;i<=n;i++) scanf("%lld",&que[i].b); for(int i=1;i<=n;i++) scanf("%lld",&que[i].c); sort(que+1,que+n+1,cmp); dp[0]=0; for(ll i=1;i<=n;i++) for(ll j=T;j>=0;j--) { if(j>=que[i].c) dp[j]=max(dp[j],dp[j-que[i].c]+que[i].a-j*que[i].b); } ll ans=-32513425; for(int i=1;i<=T;i++) ans=max(ans,dp[i]); printf("%lld",ans); return 0; }