解题思路:
                这里可以分为两种情况:
                    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.0分

1 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论