网站运营和维护都是干什么的,id文件怎么转wordpress,鞍山怎么样做一个自己的网站,哪些网站做婚纱摄影动态规划0-1背包问题 问题描写叙述#xff1a;给定n种物品和一背包。物品i的重量是wi#xff0c;其价值为vi#xff0c;背包的容量为C。问应怎样选择装入背包的物品#xff0c;使得装入背包中物品的总价值最大?对于一种物品#xff0c;要么装入背包#xff0c;要么不装。… 动态规划0-1背包问题 Ø 问题描写叙述 给定n种物品和一背包。物品i的重量是wi其价值为vi背包的容量为C。问应怎样选择装入背包的物品使得装 入背包中物品的总价值最大? Ø 对于一种物品要么装入背包要么不装。所以对于一种物品的装入状态能够取0和1.我们设物品i的装入状态为xi,xi∈ (0,1)此问题称为0-11背包问题。 过程分析 数据物品个数n5,物品重量w[n]{022654},物品价值V[n]{063546}, 第0位置为0不參与计算仅仅是便于与后面的下标进行统一无特别用处也可不这么处理。总重量c10. Ø背包的最大容量为10那么在设置数组m大小时能够设行列值为6和11那么对于m(i,j)就表示可选物品为i…n背包容量为j(总重量)时背包中所放物品的最大价值。 以下是自己写的源代码 #includestdio.h
#includestdlib.h
#includeiostream
#includequeue
#includeclimits
#includecstring
using namespace std;
const int c 10; //背包的容量
const int w[] {0,2,2,6,5,4};//物品的重量当中0号位置不使用 。
const int v[] {0,6,3,5,4,6};//物品相应的待加0号位置置为空。
const int n sizeof(w)/sizeof(w[0]) - 1 ; //n为物品的个数
int x[n1];
void package0_1(int m[][11],const int w[],const int v[],const int n)//n代表物品的个数
{//採用从底到顶的顺序来设置m[i][j]的值//首先放w[n]for(int j 0; j c; j)if(j w[n]) m[n][j] 0; //j小于w[n],所相应的值设为0否则就为能够放置 else m[n][j] v[n];//对剩下的n-1个物品进行放置。int i;for(i n-1; i 1; i--)for(int j 0; j c; j)if(j w[i]) m[i][j] m[i1][j];//假设j w[i]则当前位置就不能放置它等于上一个位置的值。//否则就比較究竟是放置之后的值大还是不放置的值大选择当中较大者。 else m[i][j] m[i1][j] m[i1][j-w[i]] v[i]? m[i1][j] : m[i1][j-w[i]] v[i];
}
void answer(int m[][11],const int n)
{int j c;int i;for(i 1; i n-1; i)if(m[i][j] m[i1][j]) x[i] 0;else { x[i] 1;j j - w[i];} x[n] m[i][j] ? 1 : 0;
}
int main()
{int m[6][11]{0};package0_1(m,w,v,n);for(int i 0; i 5; i){for(int j 0; j 10; j)printf(%2d ,m[i][j]);cout endl; } answer(m,n);cout The best answer is:\n;for(int i 1; i 5; i)cout x[i] ;system(pause);return 0;
}