背包问题 顺推解法
2007-08-19 16:38
405 查看
五种物品,体积,重量,数量,价值分别如下:
物品编号 体积 重量 数量 价值
1 30 3 10 4
2 50 8 10 5
3 10 2 10 2
4 23 5 8 3
5 130 20 5 11
限制体积最多500,重量最多100。问能带上物品最大总价值是多少??
#include<iostream.h>
#include<string.h>
int f[6][501][101];
int state[6][501][101];
void main()
...{
int v[6] = ...{0,30,50,10,23,130};
int w[6] = ...{0,3,8,2,5,20};
int c[6] = ...{0,10,10,10,8,5};
int t[6] = ...{0,4,5,2,3,11};
const int maxv = 500;
const int maxw = 100;
const int maxn = 5;
int i ;
int n,x,y;
memset(f,0,sizeof(f));
memset(state,0,sizeof(state));
for(n = 1 ; n <=maxn ; ++n)
for(x =1 ; x <= maxv ; ++x)
for( y = 1 ; y <= maxw ; ++y)
...{
//计算最大i
int maxi = c
;
if(x / v
< maxi)
maxi = x/v
;
if(y / w
< maxi)
maxi = y / w
;
for(i = 0; i <=maxi ;++i)
...{
if(f[n-1][x- i * v
][y - i * w
] + i*t
> f
[x][y])
...{
f
[x][y] = f[n-1][x- i * v
][y - i * w
] + i*t
;
state
[x][y] = i;
}
}
}
int ans= 0 ;
int xx, yy;
for( x =0 ; x < maxv; ++x)
for( y = 0 ; y < maxw ; ++y)
...{
if(f[maxn][x][y] > ans)
...{
ans = f[maxn][x][y];
xx= x;
yy = y;
}
}
cout<<ans<<endl<<endl;
for(i = maxn ; i >=1 ; --i)
...{
int tmp = state[i][xx][yy];
cout<<tmp<<endl;
xx = xx - tmp * v[i];
yy = yy - tmp * w[i];
}
}
物品编号 体积 重量 数量 价值
1 30 3 10 4
2 50 8 10 5
3 10 2 10 2
4 23 5 8 3
5 130 20 5 11
限制体积最多500,重量最多100。问能带上物品最大总价值是多少??
#include<iostream.h>
#include<string.h>
int f[6][501][101];
int state[6][501][101];
void main()
...{
int v[6] = ...{0,30,50,10,23,130};
int w[6] = ...{0,3,8,2,5,20};
int c[6] = ...{0,10,10,10,8,5};
int t[6] = ...{0,4,5,2,3,11};
const int maxv = 500;
const int maxw = 100;
const int maxn = 5;
int i ;
int n,x,y;
memset(f,0,sizeof(f));
memset(state,0,sizeof(state));
for(n = 1 ; n <=maxn ; ++n)
for(x =1 ; x <= maxv ; ++x)
for( y = 1 ; y <= maxw ; ++y)
...{
//计算最大i
int maxi = c
;
if(x / v
< maxi)
maxi = x/v
;
if(y / w
< maxi)
maxi = y / w
;
for(i = 0; i <=maxi ;++i)
...{
if(f[n-1][x- i * v
][y - i * w
] + i*t
> f
[x][y])
...{
f
[x][y] = f[n-1][x- i * v
][y - i * w
] + i*t
;
state
[x][y] = i;
}
}
}
int ans= 0 ;
int xx, yy;
for( x =0 ; x < maxv; ++x)
for( y = 0 ; y < maxw ; ++y)
...{
if(f[maxn][x][y] > ans)
...{
ans = f[maxn][x][y];
xx= x;
yy = y;
}
}
cout<<ans<<endl<<endl;
for(i = maxn ; i >=1 ; --i)
...{
int tmp = state[i][xx][yy];
cout<<tmp<<endl;
xx = xx - tmp * v[i];
yy = yy - tmp * w[i];
}
}
相关文章推荐
- 0/1背包问题之穷举解法
- 0-1背包问题(一维数组解法)
- 背包问题-四种解法(穷举,递归,二维数组,一维数组)
- 背包问题(深度优先搜索解法)
- java--0-1背包问题--动态规划解法
- 多重背包问题的两种O(M*N)解法
- 背包问题的几种解法及变形
- 多重背包问题(悲剧解法)
- 完全背包问题,java解法
- 背包问题的haskell解法
- P11: 背包问题的搜索解法
- 多重背包问题解法简单分析(POJ 1276为例)
- 01背包问题(当有的背包重量是非整数时)的递归(优化成动态规划+再用滚动数组优化)解法+一些动态规划(递归,搜索)的高级技巧
- 多背包问题近似解法及其近似比
- 背包问题的递归和非递归的解法
- 背包问题的遗传算法解法
- p1054 简单背包问题的递归解法
- 0/1背包问题,java解法
- 0-1背包问题的动态规划解法
- 完全背包问题,java解法