解题思路:
这里可以分为两种情况:
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 人评分
2^k进制数 (C++代码)使用递归方法浏览:736 |
C二级辅导-同因查找 (C语言代码)浏览:626 |
C二级辅导-计负均正 (C语言代码)浏览:698 |
C语言训练-计算一个整数N的阶乘 (C语言代码)浏览:986 |
C语言程序设计教程(第三版)课后习题6.6 (C语言代码)浏览:626 |
简单的a+b (C语言代码)浏览:385 |
C语言程序设计教程(第三版)课后习题6.10 (C语言代码)浏览:1090 |
三角形 (C++代码)递推浏览:825 |
C语言程序设计教程(第三版)课后习题6.9 (C语言代码)浏览:761 |
简单的a+b (C语言代码)浏览:626 |