典型的0-1背包问题,其状态转移方程为:
dp[ j ] = max(dp[ j ], dp[ j - weight [ i ] ] + value [ i ])
#include<iostream>
#include<cstdio>
using namespace std;
const int N = 1000 + 10;
int main(){
int t, m, weight[N], value[N], dp[N];
while(scanf("%d%d", &t, &m) != EOF){
for(int i = 0; i < m; i++) scanf("%d%d", &weight[i], &value[i]);
fill(dp, dp + t + 1, 0);
for(int i = 0; i < m; i++){
for(int j = t; j >= weight[i]; j--)
dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);
}
printf("%d\n", dp[t]);
}
return 0;
}