百度的解释:
思想很简单。
我先就一个问题来讲 经典的0/1背包问题:
/* */
可以用vector
先按照质量得大小排序 从小到大。
{(3,2),(6,2),(6,4),(4,5),(5,6)}
讲解的话可以把 其编号 为 a,b,c,d,e;
1: 开始压人数据,a-b-c<10;(重量)测试最大价值为:15
2:压入d时 a-b-c-d>10; 回溯到c的地方 因为没必要 a-b-c-e,因为按照重量的大小安排的
在c位置重新选址也就是d:a-b-d<10 ;价值为:13 所有最大价值不变;继续探索
3.a-b-d-e>10;回溯到d位置。 a-b-e;价值为:14 所以依旧不变;继续探索
重复过程还有继续选首地址 可以的得出结果
代码:
using namespace std;
int sum_w=0,sum_v=0;vector<int> v_temp,v_temp1;//前者存最大得地址 后者是临时存储得地址
int sum_weight(vector
{int sum1=0;
for(int i=0;i
{sum1+=v[v_temp1[i]].second;}
return sum1;}
int sum_value(vector
{int sum1=0;for(int i=0;i
{sum1+=v[v_temp1[i]].first;}return sum1;}
void dfs(vector
{v_temp1.clear();//清空临时存储得地址;
for(int i=start;i { v_temp1.push_back(i);//存入数据 if(sum_value(v)>=sum_v&&sum_weight(v)<=m)//如果临时容器得地址 与最大价值比较; { v_temp=v_temp1;//得到最大价值得地址 sum_w=sum_weight(v); sum_v=sum_value(v); /* for(int i=0;i } if(sum_w>m)//若质量超过了 则回溯到原地方 {v_temp1.pop_back();//删除最后得地址 i=v_temp1[v_temp1.size()-1];//回溯 v_temp1.pop_back();//重先选择新的地址 sum_w=sum_weight(v); sum_v=sum_value(v); v_temp=v_temp1; /* for(int i=0;i } }} int main(){ vector int n,m,t,t1; cin>>n>>m; cin.get(); for(int i=0;i { cin>>t>>t1; cin.get(); v_bag.push_back(make_pair(t,t1));} sort(v_bag.begin(),v_bag.end(),[](const pair<int,int> &x,const pair<int,int> &y)->int{ return x.second>y.second;}); for(int i=0;i { dfs(v_bag,n,m,i);}cout< 如有错误请提示 优化也可以 因为我没优化 哈哈 。。。。。。