#include <iostream> using namespace std; //========================== int r[100];//结果 int tr[100];//临时结果 int limiw;//背包的限重 int num;//一共拥有的物品数 int v;//背包中的物品价值 //物品结构体 struct thing { int w; int v; }; //主算法 //t[]->所有物品的数组 //i->w物品编号 //tw->现在临时背包中的重量 //tv->现在临时背包中的物品价值 void jisuan(thing t[],int i,int tw,int tv) { //编号是否超过物品数 if(i<num) { bool add = false;//判断这个物品是否在临时背包中使用 if (tw+t[i].w<=limiw)//是否加入背包 { tr[i]=1; tw +=t[i].w; tv+=t[i].v; add = true; } jisuan(t,i+1,tw,tv);//go on 判断 //回溯前是否保存临时的背包。如果临时的价值大于现在的价值就保存 if(v<tv) { v= tv; for(int j=0;j<num;j++) { r[j] = tr[j];//保存结果 } } if (add)//用到上面的 { tr[i] = 0; tw -=t[i].w; tv -=t[i].v; } jisuan(t,i+1,tw,tv); } } int main() { while (1) { //物品的数量 cin>>num; thing t[100]; for(int i=0;i<num;i++) { cin>>t[i].v;//个物品的价值 } for(int i=0;i<num;i++) { cin>>t[i].w;//个物品的重量 } jisuan(t,0,0,0); for(int i=0;i<num;i++) { cout<<r[i]<<" "; } cout<<endl; cout<<v<<endl; } }
- 1
- 粉丝: 3
- 资源: 13
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助