博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj 3624 0/1背包暨0/1背包的学习
阅读量:6623 次
发布时间:2019-06-25

本文共 1790 字,大约阅读时间需要 5 分钟。

    AC的代码:  

#include 
#include
using namespace std;#define MAX(a,b) (a>b?a:b)#define N 12881#define M 3403int value[N];int W[M],D[M];int main(){ int n,m,i,j; freopen("in.txt","r",stdin); while(scanf("%d%d",&n,&m)!=EOF) { for(i=1; i<=n; i++) { scanf("%d%d",&W[i],&D[i]); } // for(i=0;i
=W[i]; j--) { value[j]=MAX(value[j-W[i]]+D[i],value[j]); } } printf("%d\n",value[m]); } return 0;}

这是我学习0/1背包是写的这题的代码,很可惜,MLE.后来看别人的才知道把二维数组转换为以为数组才可以:

推荐这个博客给大家 里面有图示,可以帮助理解。

关键是理解这个方程就好:value[i][j]=max(value[i-1][j],D[i]+value[i-1][j-w[i]]);

#include 
#include
using namespace std;#define MAX(a,b) (a>b?a:b)#define N 12881#define M 3403int value[N][M];int W[N],D[N];int main(){ int n,m,i,j,max; freopen("in.txt","r",stdin); while(scanf("%d%d",&n,&m)!=EOF) { for(i=1; i<=n; i++) { scanf("%d%d",&W[i],&D[i]); } for(i=0;i
=1; j--) { if(W[i]<=j) //当前物品的容量小于背包容量 { //value[i][j]=MAX(D[i]+value[i-1][j-W[i]],value[i-1][j]); if(D[i]+value[i-1][j-W[i]]>value[i-1][j]) //当前物品的价值加上背包剩下的空间能放下的总量的物品的价值 //大于上一次选择的最佳方案则更新c[i][j] { value[i][j]=D[i]+value[i-1][j-W[i]]; } else { value[i][j]=value[i-1][j]; } } else { value[i][j]=value[i-1][j]; } } } printf("%d\n",value[n][m]); } return 0;}

 

转载地址:http://bwtpo.baihongyu.com/

你可能感兴趣的文章
First day of Python
查看>>
表单的重复提交问题
查看>>
闰年的判断方法 和 当目前为止你生存的天数计算方法
查看>>
课后作业—阅读笔记
查看>>
简历求职:STAR法则
查看>>
oracle导出数据加密,oracle数据出现愤怒加密算法
查看>>
linux popen获取ip地址,使用popen函数读取命令输出失败
查看>>
python 编辑html文件内容,使用Python解析和编辑HTML文件
查看>>
切换 ip 批处理
查看>>
CommandArgument 绑定多个参数
查看>>
dropdownlist可以多选。类似的例子。。。
查看>>
Objective-C 内存管理
查看>>
Linux下rz,sz与ssh的配合使用
查看>>
pku 1054 The Troublesome Frog 暴力+剪枝
查看>>
串行,并行,并发
查看>>
webservice测试工具
查看>>
Porting .Net RSA xml keys to Java
查看>>
检测 nginx.conf 是否配置正确
查看>>
最长公共子序列|最长公共子串|最长重复子串|最长不重复子串|最长回文子串|最长递增子序列|最大子数组和...
查看>>
测试妹子的呐喊:为什么总是收不到推送?
查看>>