您的位置:首页 > 其它

杭电2546题解题报告及01背包问题

2013-04-23 15:11 429 查看
这是我开始尝试着做背包问题,其实背包问题就是一个模式,掌握其二维的转移方程及一维的状态转移方程!

#include<cstdio>

#include<iostream>

#include<algorithm>

#include<string.h>

using namespace std;

const int maxn=1005;

int dp[maxn];

int value[maxn];

int weight[maxn];

int nvalue;

int zeroonepack(int cost,int weight)

{

int i;

for(i=nvalue;i-cost>=0;i--)

dp[i]=max(dp[i],dp[i-cost]+weight);//这是01背包一维表示方法!其实和二维差不多,

}

int main()

{

int n,m,i,j;

while(scanf("%d",&n)!=EOF&&n!=0)

{

for(i=0;i<n;i++)

{

scanf("%d",&value[i]);

if(value[i]>value[0])

swap(value[i],value[0]);//进行排序

}

scanf("%d",&m);

if(m<5)

{

printf("%d\n",m);//直接判断对小于5的情况

continue;

}

for(i=1;i<n;i++)

{

weight[i]=value[i];//在这题中付出的代价就是其得到的价值

}

memset(dp,0,sizeof(dp));

nvalue=m-5;//预留5元用来最后买最贵的!

for(i=1;i<n;i++)

zeroonepack(value[i],weight[i]);

printf("%d\n",m-value[0]-dp[nvalue]);

}

return 0;

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