您的位置:首页 > 其它

Charm Bracelet-POJ3624(01背包)

2015-12-10 19:46 405 查看
http://poj.org/problem?id=3624

CharmBracelet

TimeLimit:1000MSMemoryLimit:65536K
TotalSubmissions:29444Accepted:13198
Description

Bessiehasgonetothemall'sjewelrystoreandspiesacharmbracelet.Ofcourse,she'dliketofillitwiththebestcharmspossiblefromtheN(1≤N≤3,402)availablecharms.EachcharmiinthesuppliedlisthasaweightWi(1≤Wi≤400),a'desirability'factorDi(1≤Di≤100),andcanbeusedatmostonce.BessiecanonlysupportacharmbraceletwhoseweightisnomorethanM(1≤M≤12,880).

Giventhatweightlimitasaconstraintandalistofthecharmswiththeirweightsanddesirabilityrating,deducethemaximumpossiblesumofratings.

Input

*Line1:Twospace-separatedintegers:NandM
*Lines2..N+1:Linei+1describescharmiwithtwospace-separatedintegers:WiandDi

Output

*Line1:Asingleintegerthatisthegreatestsumofcharmdesirabilitiesthatcanbeachievedgiventheweightconstraints

SampleInput

46
14
26
312
27

SampleOutput

23

这个是简单的01背包从我开始接触到背包到现在我还是不懂背包的原理
开始背包的旅程
正常的背包是
i1....n
jm....0
dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]);
但是这个范围较大
如果用二维的会超内存
可以转化成一维的
dp[j]=max(dp[j],dp[j-w[i]]+v[i]);


#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
#include<iostream>

usingnamespacestd;

#defineN3500
intdp[13000];

intmain()
{
intn,m,w
,v
;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(inti=1;i<=n;i++)
scanf("%d%d",&w[i],&v[i]);
memset(dp,0,sizeof(dp));
for(inti=1;i<=n;i++)
{
for(intj=m;j>=0;j--)
{
if(j>=w[i])
dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
}
}
printf("%d\n",dp[m]);
}
return0;
}



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