0-背包问题要求的是在所装东西不超过背包容量的情况下,背包所获得的最大价值。跟背包问题不同的是,0-1背包问题要么是物品放入,要么不放入,而背包问题允许只放入物品的一部分。下面是所有代码:运行结果如图所示:#include "stdafx.h" #include<iostream> using namespace std; float bestP = 0; float cp = 0; float cw = 0; void BackTrack(int i,int n,int C,float w[],float p[]) { if(i > n - 1) { if(bestP < cp ) { bestP = cp; } return; } if(cw + w[i] <= C) { cw = cw + w[i]; cp = cp + p[i]; /*cout<<cp<<endl;*/ BackTrack(i + 1,n,C,w,p);//放入扫描下一层 //cout<<bestP<<endl; cw = cw - w[i];//回溯不放入 cp = cp - p[i]; } BackTrack(i + 1,n,C,w,p); } void Initial(int n ,float w[],float p[]) { for (int i = 0; i < n; i++) { cout<<"请输入第"<<i+1<<"个物品的重量和价值"<<endl; cin>>w[i]>>p[i]; } } void InsertSort(int n,float w[],float p[])//直接插入排序 { int i ,j; for (i = 1; i < n; i++) { float temp = p[i] / w[i]; float p1 = p[i]; float w1 = w[i]; if(temp > p[i - 1] / w[i - 1]) { for (j = i - 1; j >= 0 && temp > p[j] / w[j]; j--) { p[j + 1] = p[j]; w[j + 1] = w[j]; } p[j + 1] = p1; w[j + 1] = w1; } } } void display(int n,float w[],float p[]) { for (int i = 0; i < n; i++) { cout<<p[i]<<" "; } cout<<endl; for (int i = 0; i < n; i++) { cout<<w[i]<<" "; } cout<<endl; } int _tmain(int argc, _TCHAR* argv[]) { float w[20]; float p[20]; int n; int C; cout<<"请输入背包的容量:"; cin>>C; cout<<"请输入物品的个数:"; cin>>n; Initial(n,w,p); InsertSort(n,w,p); cout<<"排序为:"<<endl; display(n,w,p); BackTrack(0,n,C,w,p); //BackTrack(1,n,C,w,p); cout<<"最大价值为"<<bestP<<endl; return 0; }
0-1背包问题(回溯法)
最新推荐文章于 2023-07-11 12:56:49 发布