状态转移方程:
dp[v] = max{dp[v], dp[v-size[i]]+value[i]}
// size[i] --> 第 i 件物品的大小 value[i]--> 第 i 件物品的价值
// 背包大小为 V
// 物品数量为 N
#include<iostream>
#include<string>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<ctype.h>
#include<algorithm>
#include<map>
#include<vector>
#define MAX 100005
#define MOD 1000003
#define inf 100000000
#define eps 1e-9
#define pi acos(-1.0)
#define LL long long
#define I64 __int64
#define max(a, b) ((a) > (b) ? (a) : (b))
#define min(a, b) ((a) < (b) ? (a) : (b))
// now 背包问题
int dp[1000];
int main()
{
int V, N;
int size[20], value[20];
freopen("in.txt", "r", stdin);
while(scanf("%d", &V) != EOF)
{
scanf("%d", &N);
for(int i = 1;i <= N;i ++)
scanf("%d %d", &size[i], &value[i]);
// processing
for(int i = 1;i <= N;i ++)
{
for(int v = V;v > size[i];v --)
{
dp[v] = max(dp[v], dp[v-size[i]]+value[i]);
}
}
printf("%d\n", dp[V]);
}
}
/*
100 5
77 92
22 22
29 87
50 46
99 90
200 8
79 83
58 14
86 54
11 79
28 72
62 52
15 48
68 62
*/