H2330819074


私信TA

用户名:dotcpp0692243

访问量:1812

签 名:

慢即快

等  级
排  名 440
经  验 4850
参赛次数 1
文章发表 18
年  龄 19
在职情况 学生
学  校 贺州学院
专  业 软件工程

  自我简介:

TA的其他文章

解题思路:
                这里可以分为两种情况:
                    1.有限次的情况,归结为解有限次01背包的问题

                    2.无限次的情况,解完全背包的问题

                把情况判断好就行。

注意事项:
    1.这题实质为01背包与完全背包的组合,具体的“01背包问题的思路讲解”和“完全背包的思路讲解”我就不在这里说了,大家可以对应去本站的2131和2132查看题解获得。

    2.背包问题建议应该从01背包问题入手,尤其是“用二维数组解01背包”的思路,那个思路尤为的经典与重要,理解了那个思路,我们就可以自然地去解决其他背包的问题,理解了那个思路,也可以帮助我们去更好地理解“动态规划”这一概念。

    3.“01背包问题”没学习的话,建议你们可以去看b站“钉耙编程-刘春英老师”讲的《杭电ACM刘老师-算法入门培训-第6讲-背包入门》他讲“用二维数组解01背包”的思路讲得很好,以下是代码:

参考代码:

#includeint max(int a1,int b1)
{
	return a1>b1?a1:b1;
}
int a[200];
int main()
{
	int w[2000],c[2000],k[2000];
	int u,o,p;
	int m,n;
	int i,j;
	int l=0;
	scanf("%d  %d",&m,&n);
	for(i=1;i<=n;i++)
	{
		scanf("%d  %d  %d",&u,&o,&p);
		if(p!=0)//有限次 
		{
			for(j=1;j<=p;j++)
			{
				l++;
				w[l]=u;//记录重量
				c[l]=o;//记录价值
				k[l]=1;//记录标记
			}
		}
		else//无限次
		{
			l++;
			w[l]=u;//记录重量
			c[l]=o;//记录价值
			k[l]=0;//记录标记
		}
	}
	for(i=1;i=1;j--)
			{
				if(j>=w[i])
				{
					a[j]=max(a[j],c[i]+a[j-w[i]]);	
				}
			}
		}
		else//无限次
		for(j=1;j=w[i])
			{
				a[j]=max(a[j],c[i]+a[j-w[i]]);
			}
		}
	}
	printf("%d",a[m]);
	return 0;
}


 

0.0分

1 人评分

  评论区

  • «
  • »