背包J题 背包

背包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;
}
发布了130 篇原创文章 · 获赞 3 · 访问量 1628

猜你喜欢

转载自blog.csdn.net/yeyuluo/article/details/103895108