数据结构学习-递归(背包问题)
2016-05-31 17:02
477 查看
问题描述:
设有不同价值,不同重量的物品n件,求从这n件物品中选取一部分物品的方案,使选中物品的总重量不超过指定的限制重量,但选中的物品总价值最大。代码:
#include <iostream> using namespace std; const int N=100; int limitw; int totv; int maxv; int op ,cop ; struct { int weight; int value; }a ; int n; void find(int i,int tw,int tv) { if(tw+a[i].weight<=limitw) { cop[i]=1; if(i<n-1) find(i+1,tw+a[i].weight,tv); else { for(int k=0;k<n;k++) op[k]=cop[k]; maxv=tv; } cop[i]=0; } if(tv-a[i].value>maxv) { if(i<n-1) find(i+1,tw,tv-a[i].value); else { for(int k=0;k<n;k++) op[k]=cop[k]; maxv=tv-a[i].value; } } } int main() { int k,w,v; cout<<"物品种数:"; cin>>n; for(k=0,totv=0;k<n;k++) { cout<<"\t第"<<k+1<<"种物品(重量,价格):"; cin>>w>>v; a[k].weight=w; a[k].value=v; totv+=v; } cout<<"背包能承受的重量:"; cin>>limitw; maxv=0; for(k=0;k<n;k++) cop[k]=0; find(0,0,totv); cout<<"最佳填装方案是:"<<endl; for(k=0;k<n;k++) if(op[k]==1) cout<<"\t第"<<k+1<<"种物品"<<endl; cout<<"总价值="<<maxv<<endl; return 0; }
运行结果:
相关文章推荐
- 大话数据结构:线性表(3)
- hdu 2923 floyd+map容器
- hdu 1217 floyd+map容器
- hdu 2112 floyd+map容器
- hdu 1548 最短路
- hdu 2680 最短路
- hdu 1166线段树入门
- ACM 数据结构 线段树 HDU 1540 Tunnel Warfare
- 线段树入门
- OpenResty学习笔记(一)数据结构与控制流
- POJ 1611 The Suspects( 并查集)
- ACM 数据结构 线段树 HDU 1698Just a Hook
- ACM 数据结构 线段数 HDU 1754 I Hate It
- ACM 数据结构 线段数 HDU 1166 敌兵布阵
- 白话篇:利用二叉树先序/中序/后序确定二叉树求法分析
- java 数据结构之单链表
- Intersection of Two Linked Lists
- 遍历二叉树
- python数据结构之列表基本操作[学习笔记]
- 二叉树的基础知识