HDU2191(多重背包问题dp)

解题思路:多重背包裸题

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#define inf 0x3f3f3f3f
using namespace std;
int dp[105];
struct node
{
	int v,w,num;
}s[109];
int n,m;
void solve()
{
	for(int i=0;i<m;i++)
	{
		int t=s[i].num,k=1,v=s[i].v,w=s[i].w;
		while(k<t)
		{
			for(int j=n;j>=k*v;j--)
			{
				dp[j]=max(dp[j],dp[j-k*v]+k*w);
			}
			t-=k;
			k*=2;
		}
		for(int j=n;j>=t*v;j--)
		{
			dp[j]=max(dp[j],dp[j-t*v]+t*w);
		}
	}
}
int main()
{
	//freopen("t.txt","r",stdin);
	int T;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d%d",&n,&m);
		for(int i=0;i<m;i++)
		{
			scanf("%d%d%d",&s[i].v,&s[i].w,&s[i].num);
			//cout<<i<<endl;
		}
		memset(dp,0,sizeof(dp));
		solve();
		int ma=0;
		for(int i=0;i<=n;i++)
		{
			ma=max(ma,dp[i]);
		}
		printf("%d\n",ma);
	}
	
	return 0;
 } 

猜你喜欢

转载自blog.csdn.net/qq_39861441/article/details/88574905