链接:点击打开链接
题意:给一个容量是m的背包,有n种物品,给出每种物品的体积,买x个第i种物品则会获得A[i]*x+b[i]个糖,问怎么买能使获得的糖最多
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
long long dp[2005],w[2005],a[2005],b[2005];
int main(){
long long t,n,m,i,j,k;
scanf("%I64d",&t);
while(t--){
scanf("%I64d%I64d",&m,&n);
for(i=1;i<=n;i++)
scanf("%I64d%I64d%I64d",&w[i],&a[i],&b[i]);
memset(dp,0,sizeof(dp));
for(i=1;i<=n;i++){ //先放进去个之后就每次加a[i]
for(j=m;j>=w[i];j--) //先01背包再完全背包
dp[j]=max(dp[j],dp[j-w[i]]+a[i]+b[i]);
for(j=w[i];j<=m;j++)
dp[j]=max(dp[j],dp[j-w[i]]+a[i]);
}
printf("%I64d\n",dp[m]);
}
return 0;
}