01背包
来源:互联网 发布:osx和linux 编辑:程序博客网 时间:2024/06/14 05:44
01背包问题:
有一个体积为V的背包,有n件物品,每件物品的体积,价值分别为w[i],p[i];要从n件物品中选些放入背包中,使背包里物品的总价值最大。
动态方程:c[i][j]=max(c[i-1][j],c[i-1][j-w[i]]+p[i]).
有关动态方程方面的代码:
- for (int i = 1; i <= n; i++) {
- for (int j = 1; j <= total_weight; j++) {
- if (w[i] > j) {
- c[i][j] = c[i-1][j];
- }
- else { //也可以用<span style="font-family: KaiTi_GB2312;font-size:18px;">c[i][j]=max(c[i-1][j],c[i-1][j-w[i]]+p[i])代替下面的</span>
- if (c[i-1][j] > v[i]+c[i-1][j-w[i]]) {
- c[i][j] = c[i-1][j];
- }
- else {
- c[i][j] = v[i] + c[i-1][j-w[i]];
- }
- }
- }
- }
题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=2602
初学者代码:
- #include<iostream>
- #include<cstring>
- #include<cstdio>
- using namespace std;
- int c[1011][1011];
- int max(int a,int b)
- {
- return a>b?a:b;
- }
- int knapsack(int m,int n)
- {
- memset(c,0,sizeof(c));
- int i,j,val[1001],V[1001];
- for(i=1;i<=n;i++)
- scanf("%d",&val[i]);
- for(i=1;i<=n;i++)
- scanf("%d",&V[i]);
- for (i = 1; i <= n; i++)
- {
- for (j = 1; j <= m; j++)
- {
- if (V[i] > j)
- {
- c[i][j] = c[i-1][j];
- }
- else
- {
- c[i][j]=max(c[i-1][j],c[i-1][j-V[i]]+val[i]);
- }
- }
- }
- return (c[n][m]);
- }
- int main()
- {
- int t,n,m;
- scanf("%d",&t);
- while(t--)
- {
- scanf("%d%d",&n,&m);
- printf("%d\n",knapsack(m,n));
- }
- return 0;
- }
这个问题代码需要优化,减少时间空间复杂度,
(优化后代码)AC代码:
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- using namespace std;
- int c[1011];
- int max(int a,int b)
- {
- return a>b?a:b;
- }
- int knapsack(int m,int n)
- {
- memset(c,0,sizeof(c));
- int i,j,val[1001],V[1001];
- for(i=1;i<n+1;i++)
- scanf("%d",&val[i]);
- for(i=1;i<n+1;i++)
- scanf("%d",&V[i]);
- for(i=1;i<n+1;i++)
- for(j=m;j>=V[i];j--)
- c[j]=max(c[j-V[i]]+val[i],c[j]);
- return(c[m]);
- }
- int main()
- {
- int t,n,m;
- scanf("%d",&t);
- while(t--)
- {
- scanf("%d%d",&n,&m);
- printf("%d\n",knapsack(m,n));
- }
- return 0;
- }
0 0
- 【背包专题】01背包
- 01背包,完全背包
- 01背包 完全背包
- 01背包/完全背包
- 01背包,完全背包
- 背包问题---01背包
- 背包入门--01背包
- 【背包专题】01背包
- 01背包,完全背包
- 01背包,完全背包, 多重背包
- 01背包,完全背包,多重背包
- 01背包、完全背包、多重背包详解
- 01背包,完全背包,多重背包
- 01背包、完全背包、多重背包
- 01背包、完全背包、多重背包
- 01背包、完全背包、多重背包
- 01背包、完全背包、多重背包
- 01背包、完全背包、多重背包模板
- DjangoRestFramework实践笔记
- 威佐夫博弈
- HDU 2821--Pusher
- STL算法使用
- 数据结构与算法学习笔记——二叉树的初步理解
- 01背包
- 中点画圆法(计算机图形学)
- iOS 微信支付和支付宝支付
- [iOS]Mac下获取App Store安装包路径
- 10个JavaScript测试
- UI高级--------NSRunLoop
- 第三章 3.5.5 与旧代码的接口
- 学生知识点总结之三(EOF与BOF)
- 009:How can I test if an array contains a certain value?