您的位置:首页 > 其它

(精)hdoj 2602(01背包问题)(动态规划)

2012-04-23 19:42 351 查看
/*
1 输入部分应该是放在1到n,最后为=号因为。我们初始的时候认为0是没有取任何物品的。如果说以0为开始,那么第一件装备没有选
2 输入的时候应该看清楚什么是value什么是valume。

*/
#include<iostream>
#include<stdio.h>
using namespace std;
#define MAX 1005

//#define MAX 15
int f[MAX][MAX];//f[i][j]表示前i件物品当中选出若干件,放在剩余未j的背包中所得到的最大收益

//状态转化方程为f[i][j]=max{f[i-1][j-Wi]+Pi,f[i-1][j]}.有一个条件是j>=Wi。这样的时候才能保证不会是0
int w[MAX];
int v[MAX];
int main()
{

//freopen("in.txt","r",stdin);
int casen;scanf("%d",&casen);
int i,j,k;

int M;//一共有M件物品
int W;//总的空间是W

while(casen--)
{
//输入部分

scanf("%d %d",&M,&W);

for(i=1;i<=M;i++)
{
scanf("%d",&v[i]);
}
for(i=1;i<=M;i++)
{
scanf("%d",&w[i]);
}

//初始化
for(i=0;i<MAX;i++)
{
for(j=0;j<MAX;j++)
{
f[i][j]=0;
}
}

//开始处理
for(i=0;i<=W;i++)
{
f[0][i]=0;
}

//i表示第i件物品。我们主要是看第i件物品是不是放入
for(i=1;i<=M;i++)
{
for(j=0;j<=W;j++)
{
f[i][j]=f[i-1][j];

//如果剩余的背包能够放下第i件物品,而且放入以后比不放入的价值变大了。
if( j>=w[i] && f[i-1][j-w[i]]+v[i]>f[i][j] )
{
f[i][j]=f[i-1][j-w[i]]+v[i];
}
}
}

cout<<f[M][W]<<endl;

}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: