原题链接:信息学奥赛一本通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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复