小背包 | ||||||
| ||||||
Description | ||||||
有一个容量为m(1<=m<=4000000)的背包,有n(1<=n<=16)个物品,每个物品有体积v(1<=v<=2012)和价值w(0<=2012),现在要你选择一些物品,使得背包所装物品的总价值最大。 | ||||||
Input | ||||||
有多组测试数据,但是不会超过10组。 对于每组测试数据,第一行是两个整数m和n,表示背包容量的和物品个数。接下来有n行,每行有两个整数,表示一个物品的体积和价值。 输入到文件结束。 | ||||||
Output | ||||||
对于每组测试数据,输出一行,包含一个整数,为背包能装下物品的最大价值。 | ||||||
Sample Input | ||||||
10 3 6 9 5 5 5 5 3 2 1 2 2 1 | ||||||
Sample Output | ||||||
10 3 | ||||||
Source | ||||||
2012级新生练习赛 3 | ||||||
Author | ||||||
黄李龙@HRBUST |
#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
struct wupin
{
int c,val;
}a[1000000];
int dp[101010];
int main()
{
int v,n;
while(~scanf("%d%d",&v,&n))
{
if(v>=32192)v=32192;//最多12个物品 每个物品最大体积为2012.v不能大于12*2012
memset(dp,0,sizeof(dp));
memset(a,0,sizeof(a));
for(int i=0;i<n;i++)
scanf("%d%d",&a[i].c,&a[i].val);
for(int i=0;i<n;i++)
{
for(int j=v;j>=a[i].c;j--)
{
dp[j]=max(dp[j],dp[j-a[i].c]+a[i].val);
}
}
printf("%d\n",dp[v]);
}
}