多重背包(原本是一个01背包)
来源:互联网 发布:开根号c语言 编辑:程序博客网 时间:2024/05/02 06:07
题目链接:点击打开链接
代码:
#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;int q[15][15];int dp[100010];int w[100010],p[100010],num[100010];int k;void zerobeibao(int cost,int weight ,int n){ for(int i=n; i>=cost; i--) dp[i]=max(dp[i],dp[i-cost]+weight);}void wanquanbeibao(int cost ,int weight ,int n ){ for(int i=cost; i<=n; i++) { dp[i]=max(dp[i],dp[i-cost]+weight); }}int duochongbeibao(int c[],int w[],int num[],int n,int b){ memset(dp,0,sizeof(dp)); for(int i=1; i<k; i++) { if(num[i]*c[i]>b) wanquanbeibao(c[i],w[i],b); else { int k1=1; while(k1<num[i]) { zerobeibao(k1*c[i],k1*w[i],b); num[i]-=k1; k1<<=1; } zerobeibao(num[i]*c[i],num[i]*w[i],b); } } return dp[b];}int main(){// int n,m; int a,b; scanf("%d%d",&a,&b); memset(q,0,sizeof(q)); for(int i=0; i<a; i++) { int q1,q2; scanf("%d%d",&q1,&q2); q[q1][q2]++; } k=1; for(int i=1; i<=10; i++) for(int j=1; j<=10; j++) { if(q[i][j]) { w[k]=i; p[k]=j; num[k]=q[i][j]; k++; } } printf("%d\n",duochongbeibao(w,p,num,a,b)); return 0;}原本是一个01背包,但是由于时间复杂度太大,超时,所以·看到后面的数据比较少,所以考虑转化为多重背包,其实思维性不大!!!!!!
贴上另外一道题hdu2192(悼念512)!!!
时间复杂度是O(n*v),然后01背包的时间复杂度是O(N^2),那个n是物品的种数,v是容量。
0 0
- 多重背包(原本是一个01背包)
- 背包问题(01背包,完全背包,多重背包)
- 背包问题(01背包,完全背包,多重背包)
- 背包(01背包、完全背包、多重背包)问题总结
- 背包模板(01背包,完全背包,多重背包)
- 背包问题(01背包,完全背包,多重背包)
- 背包问题(01背包 + 完全背包 + 多重背包)
- 背包问题(01背包,完全背包,多重背包)
- 背包问题模板(01背包,完全背包,多重背包)
- 经典背包问题----(01背包、完全背包、多重背包)
- DP总结(1) 01背包 完全背包 多重背包
- 01背包模板、完全背包 and 多重背包(模板)
- 动态规划总结(01背包 完全背包 多重背包)
- 动态规划初步( 01 背包、完全背包、多重背包)
- 01背包模板、完全背包 and 多重背包(模板)
- hdu1171 01背包 | 多重背包
- (背包三)多重背包
- 01背包,完全背包, 多重背包
- KoaHub平台基于Node.js开发的Koa的skip插件代码详情
- 抓取百度关键词排名、标题、连接、描述
- JDBC直接连接数据库
- 二次型(求梯度) —— 公式的简化
- Stacked Autoencoders学习笔记
- 多重背包(原本是一个01背包)
- 拼图响应式前端框架版响应式后台正式发布
- 使用多态替代If else或switch的更多尝试
- Zookeeper--Zookeeper是什么
- java关键字
- 正则表达式学习
- 软件开发中的详细设计
- CentOS 7最小化安装后找不到‘ifconfig’命令——修复小提示
- 【目录】我的原创技术视频教程