1.问题
装载问题(0-1背包问题)
2.解析
描述:需对容量为c 的背包进行装载。从n 个物品中选取装入背包的物品,每件物品i 的重量为wi ,价值为pi 。对于可行的背包装载,背包中物品的总重量不能超过背包的容量,最佳装载是指所装入的物品价值最高。
3.设计
#include<iostream>
#include<string.h>
using namespace std;
int main(){
int i, j;
int n, c;
int w[100], p[100], f[100][100];
while(1){
cin >> n >> c;
if(n == 0 && c == 0){
break;
}
for(i = 1; i <= n; i++){
cin >> w[i];
}
for(i = 1; i <= n; i++){
cin >> p[i];
}
memset(f,0,sizeof(f));
for(i = 1; i <= n; i++){
for(j = c; j >=w[i]; j--){
f[i][j] = (f[i-1][j] > (f[i-1][j-w[i]] + p[i])) ? f[i-1][j] : (f[i-1][j-w[i]]+p[i]);
}
}
cout << f[n][c] <<endl;
}
return 0;
4.分析
这是一个整数规划问题,也是0-1背包问题的特殊情况。对于0-1背包问题可以使用动态规划算法求解,但是对于这个问题有更好的算法:贪心策略。贪心法:每次都选择最轻的,然后再从剩下的n-1件物品中选择最轻的。
算法策略:把n件物品 从小到大排序,然后根据贪心策略尽可能多的选出前i个物品,直到不能装为止。
装载问题(0-1背包问题)算法时间复杂度为O(nB).