完全背包问题

今天联系到了完全背包问题,看了很久的板子,才动的题,最后wr到崩溃。

先分享一下板子

	for(int i=0;i<m;i++)
			for(int j=0;j<=mon;j++)
			{	
				for(int k=0;k*p[i]<=j;k++)
				{
					dp[i+1][j]=max(dp[i+1][j],dp[i][j-k*p[i]]+k*h[i]);	
				}	
            } 
for(int i=0;i<m;i++)
    for(int j=0;j<=mon;j++)
    {
        if(j<p[i])
            dp[i+1][j]=dp[i][j];
        else 
            dp[i+1][j]=max(dp[i][j],dp[i+1][j-p[i]]+h[i]);
    }

一个两重循环一个三重循环,

题目是hdu 2191;

套板子,二重循环没办法改进(还望大佬指名,三重循环主要是,取每个大米的数量一定,只需价格判断条件k<=num(大米数量即可)

#include <iostream>
#include <cstring>
using namespace std;
long long p[120],h[120],c[120],dp[120][120];
int main(){
	int t;
	cin>>t;
	while(t--)
	{	memset(dp,0,sizeof(dp));
		int mon,m;
		cin>>mon>>m;
		for(int i=0;i<m;i++)
			cin>>p[i]>>h[i]>>c[i];
		for(int i=0;i<m;i++)
			for(int j=0;j<=mon;j++)
			{	
				for(int k=0;k*p[i]<=j&&k<=c[i];k++)
				{
					dp[i+1][j]=max(dp[i+1][j],dp[i][j-k*p[i]]+k*h[i]);	
				}	
			} 
		cout<<dp[m][mon]<<endl;
	} 
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值