Sample Input
1
100 2
10 2 1
20 1 1
Sample Output
21
题意:共有m元钱和n种东西,求每种单价p,而且你买x个该种物品可以得到Ax+B个,求m元钱最多能得到多少。
思路:先01背包处理出A+B的情况,再用完全背包往里算加A能得到的情况。
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<vector> #include<map> #include<set> #include<queue> #include<stack> #include<string> #include<algorithm> using namespace std; #define maxn 200050 int T,n,m,t,k,l,tot,j; int q[1005][3]; int dp[2005]; int main() { int k,n; scanf("%d",&T); while(T--) { scanf("%d%d",&k,&n); for(int i = 1;i <= n;i++) scanf("%d%d%d",&q[i][0],&q[i][1],&q[i][2]); int maxx = 0; memset(dp,0,sizeof(dp)); for(int i = 1;i <= n;i++) for(int j = k;j >= q[i][0];j--) { dp[j] = max(dp[j],dp[j-q[i][0]]+ q[i][1] + q[i][2]); maxx = max(maxx,dp[j]); } for(int i = 1;i <= n;i++) for(int j = q[i][0];j <= k;j++) { dp[j] = max(dp[j],dp[j-q[i][0]]+ q[i][1]); maxx = max(maxx,dp[j]); } printf("%d ",maxx); } return 0; }