原题链接:信息学奥赛一本通T1270-混合背包
解题思路:
这里可以分为两种情况:
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 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复