问题及代码:
/*
* Copyright (c) 2016, 烟台大学计算机与控制工程学院
* All rights reserved.
* 文件名称:01.cpp
* 作 者:单昕昕
* 完成日期:2016年5月16日
* 版 本 号:v1.0
* 问题描述:编写一个程序exp5-2.cpp,求解背包问题:
设有不同价值、不同重量的物品n件,求从这n件物品中选取一部分物品的方案,
使选中物品的总重量不超过指定的限制重量,但选中物品的总价值最大。
* 程序输入:n种物品的价值和重量。
* 程序输出:选取物品的最佳方案和物品的最大总价值。
*/
#include
#include
#include
using namespace std;
#define MAXN 1001
int w[MAXN],v[MAXN],vis[MAXN][MAXN];
//分别表示物品重量、价值和是否取得该方案的标记
int n;//物品总数
int rec(int i,int j,int sum)
{
int res;
if(i==n) res=sum;//递归出口
else if(j
{
res=rec(i+1,j,sum);
vis[i-1][j]=0;
}
else
{
if(rec(i+1,j,sum)
res=max(rec(i+1,j,sum),rec(i+1,j-w[i],sum+v[i]));
}
return res;
}
int main()
{
memset(w,0,sizeof(w));//初始化
memset(v,0,sizeof(v));
memset(vis,0,sizeof(vis));
cout<
cin>>n;
int i,cnt=0;
char c;//逗号的输入
for(i=0; i
{
cout<
cin>>w[i]>>c>>v[i];
}
cout<
int vol;
cin>>vol;
cout<
int ans=rec(0,vol,0);//调用递归函数求得总价值
for(i=0; i
for(int j=0; j
if(vis[i][j]==1)
{
cout<
break;
}
cout<
return 0;
}
运行结果:
多了一个vis标记方便输出方案。