您的位置:首页 > 其它

NYOJ 860 又见01背包

2017-02-11 17:58 211 查看
时间限制:1000 ms  |  内存限制:65535 KB
难度:3
描述
    有n个重量和价值分别为wi 和 vi 的 物品,从这些物品中选择总重量不超过 W 
的物品,求所有挑选方案中物品价值总和的最大值。
  1 <= n <=100
  1 <= wi <= 10^7
  1 <= vi <= 100
  1 <= W <= 10^9
输入多组测试数据。

每组测试数据第一行输入,n 和 W ,接下来有n行,每行输入两个数,代表第i个物品的wi 和 vi。输出满足题意的最大价值,每组测试数据占一行。样例输入
4 5
2 3
1 2
3 4
2 2

样例输出
7


若用dp[i]表示重量为i时所能获得的最大价值,由于W最大取到1e9程序会爆栈,所以应转换一下思维,dp[i]表示价值为i时所用的最小重量,问题便得到解决。反过来考虑也加深了对背包模型的理解。代码如下:

01.
#include<cstdio>

02.
#include<algorithm>

03.
using
namespace

std;

04.
const
int

M=1e4+5,INF=1<<30;

05.
int
main()

06.
{

07.
int
n,W,w,v;

08.
while
(
scanf
(
"%d
%d"
,&n,&W)!=EOF)

09.
{

10.
int
dp[M],ans=INF;

11.
for
(
int
i=1;i<=10000;++i)
dp[i]=INF;

12.
dp[0]=0;

13.
for
(
int
i=1;i<=n;++i)

14.
{

15.
scanf
(
"%d %d"
,&w,&v);

16.
for
(
int
j=10000;j>=v;--j)

17.
{

18.
dp[j]=min(dp[j-v]+w,dp[j]);

19.
}

20.
}

21.
for
(
int
i=10000;i>=0;--i)

22.
{

23.
if
(dp[i]<=W)

24.
{

25.
printf
(
"%d\n"
,i);

26.
break
;

27.
}

28.
}

29.
}

30.
return
0;

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