使用动态规划法解决0/1背包问题
来源:互联网 发布:nba2016数据 编辑:程序博客网 时间:2024/05/21 11:30
问题:
给定n种物品和一个背包i(1<=i<=n)的重量是Wi,其价值为Vi,背包的容量为C,对每种物品只能有两种选择:装入或者不装入背包。如何选择装入背包的物品使得装入背包中的物品的总价值最大?
算法使用C++语言实现:
w[]:物品的重量数组:2,2,6,5,4
v[]:物品的价值数组:6,3,5,4,6
n:物品的数量:5
C:背包的容量:10
x[5]:存储物品拿与不拿的状态的数组
*/
#include<iostream.h>
int max(int a,int b)
{
if(a>=b)
return a;
else return b;
}
int KnapSack(int n,int w[],int v[],int x[],int C)
{
int i,j;
for(i=0;i<=n;i++)
V[i][0]=0;
for(j=0;j<=C;j++)
V[0][j]=0;
for(i=0;i<=n-1;i++)
for(j=0;j<=C;j++)
if(j<w[i])
V[i][j]=V[i-1][j];
else
V[i][j]=max(V[i-1][j],V[i-1][j-w[i]]+v[i]);
j=C;
for(i=n-1;i>=0;i--)
{
if(V[i][j]>V[i-1][j])
{
x[i]=1;
j=j-w[i];
}
else
x[i]=0;
}
cout<<"选中的物品是:"<<endl;
for(i=0;i<n;i++)
cout<<x[i]<<endl;
return V[n-1][C];
}
void main()
{
int s;//获得的最大价值
int w[5];//物品的重量
int v[5];//物品的价值
int x[5];//物品的选取状态
int n,i;
int C;//背包最大容量
cout<<"请输入背包的最大容量:"<<endl;
cin>>C;
cout<<"物品数量:"<<endl;
cin>>n;
cout<<"请分别输入物品的重量:"<<endl;
for(i=0;i<n;i++)
cin>>w[i];
cout<<"请分别输入物品的价值:"<<endl;
for(i=0;i<n;i++)
cin>>v[i];
s=KnapSack(n,w,v,x,C);
cout<<"最大价值为:"<<s<<endl;
}
阅读全文
0 0
- 使用动态规划法解决0/1背包问题
- 动态规划解决0-1背包问题
- 动态规划解决0-1背包问题
- 动态规划解决0-1背包问题
- 动态规划解决0-1背包问题
- 动态规划解决0-1背包问题
- 动态规划解决0-1背包问题
- 动态规划解决0-1背包问题
- 动态规划解决0-1背包问题
- 动态规划解决0/1背包问题
- 动态规划解决0/1背包问题
- 动态规划解决0-1背包问题
- 动态规划解决0-1背包问题
- 动态规划解决0-1背包问题
- 动态规划与回溯法解决0-1背包问题
- 动态规划法解决0-1背包问题(C++)
- 动态规划法解决0/1背包问题详解
- 动态规划解决0_1背包问题
- linux--tar命令
- struts2入门
- java:对输入数据的异常处理
- 【队内胡策 11.1】 T3
- 安装php_redis扩展(Windows环境下)
- 使用动态规划法解决0/1背包问题
- 多线程与多进程(二)---线程优先级与线程安全
- Spring注解大全
- nested exception is org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)
- Jupyter Notebook打开时报错的问题解决办法
- ceph主要数据结构解析2-Rados.h
- memmove 和 memcpy的区别以及处理内存重叠问题
- 三子棋小游戏实现
- Java面试经典题目