背包J题
原题链接https://vjudge.net/contest/348156#problem/J
现在有一定的钱 有n种大米每种大米有c袋,要求购买最多的大米
在进行01背包时需要考虑每种大米的袋数,将一种商品消耗完之后再进行下一个
#include<cstring>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<queue>
#include<stack>
using namespace std;
int main()
{
long long t;
scanf("%lld",&t);
while(t--)
{
long long n,m;
scanf("%lld %lld",&n,&m);
long long v[10005];
long long w[10005];
long long sum[10005];
long long dp[10005];
memset(v,0,sizeof(v));
memset(w,0,sizeof(w));
memset(sum,0,sizeof(sum));
memset(dp,0,sizeof(dp));
long long i,j,z;
for(i=1; i<=m; i++)
{
scanf("%lld %lld %lld",&v[i],&w[i],&sum[i]);
}
for(i=1; i<=m; i++)
{
for(j=n; j>=v[i]; j--)
{
for(z=1; z<=sum[i]; z++)//对于每种大米的袋数进行计数
{
if(j>=v[i]*z)
{
dp[j]=max(dp[j],dp[j-v[i]*z]+w[i]*z);
}
}
}
}
printf("%lld\n",dp[n]);
}
return 0;
}