首页 > 代码库 > 动态规划经典题解--背包问题
动态规划经典题解--背包问题
1、完全背包--背包不允许剩余
#include <iostream>#include <string.h>#define N 50002#define M 2002using namespace std; //测试OJ:nyoj 311 /* 背包不允许剩余,与允许剩余相比,只需将d[i]初始为负无穷大,d[0]=0 d[i]: 用去i容量时的最大价值 */ int d[N];struct Node { int pri; int vol;}c[M]; int main(){ freopen("D:/Documents/work/in.txt", "r", stdin); int t, i, j, m, v; cin>>t; while(t--) { cin>>m>>v; memset(d, -1000000, sizeof(d)); d[0]=0; for(i=0; i<m; i++) cin>>c[i].vol>>c[i].pri; for(i=0; i<m; i++){ for(j=c[i].vol; j<=v; j++){ if(j>=c[i].vol) d[j]=max(d[j], d[j-c[i].vol]+c[i].pri); //d[j]表示装当前的货,d[j-c[i].vol]+c[i].pri表示替换成当前的货物 } } if(d[v]<0) cout<<"NO"<<endl; else cout<<d[v]<<endl; } return 0;}
2、01背包--大容量背包
#include <iostream>#include <string.h>using namespace std;#define N 20000int d[N]={0};int w[102];int v[102];/* 背包问题:大容量背包问题 测试oj:nyoj 860 由于背包容量太大,无法开出内存,将问题转化,价值和容量互换 一共w容量装价值v的货物,使v最大问题 转化为 一共有v价值的货物用w容量来装,使w容量内v最大 遗留问题:d初始值大于这个或小于这个都可能无法过oj测试用例 */int main(){// freopen("D:/Documents/work/in.txt","r",stdin); int n, i, j, p, c;//c 可容纳重量 while(cin>>n>>c) { int sum=0;//总价值 for(i=0; i<n; i++){ cin>>w[i]>>v[i]; sum+=v[i]; } memset(d, 1000000, sizeof(d)); d[0]=0; for(i=0; i<n; i++){ for(j=sum; j>=v[i]; j--) d[j]=min(d[j], d[j-v[i]]+w[i]); } int result=0;// 可容纳重量内的最大价值 for(i=sum; i>=0; i--) if(d[i]<=c){ result=i; break; } cout<<result<<endl; } return 0;}
动态规划经典题解--背包问题
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。