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。输出满足题意的最大价值,每组测试数据占一行。样例输入
样例输出
若用dp[i]表示重量为i时所能获得的最大价值,由于W最大取到1e9程序会爆栈,所以应转换一下思维,dp[i]表示价值为i时所用的最小重量,问题便得到解决。反过来考虑也加深了对背包模型的理解。代码如下:
难度: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.
}
相关文章推荐
- nyoj860_又见01背包
- nyoj860 又见01背包
- 背包问题——nyoj860 又见01背包
- NYOJ 860 又见01背包
- NYOJ 860 又见01背包
- 又见01背包(nyoj 860)
- nyoj860又见01背包
- NYOJ-860 又见01背包
- NYOJ860 又见01背包
- NYOJ860_又见01背包
- NYOJ 860 又见01背包
- nyoj 860 又见01背包 【01-背包变形】
- NYOJ 860 又见01背包
- nyoj 860 又见01背包 【另类01背包】
- nyoj860又见01背包
- NYOJ 860 又见01背包(01背包理解运用)
- nyoj860 01背包变形-好题
- NYOJ 860 又见01背包
- nyoj 860又见01背包(01背包)
- nyoj860 又见01背包