典型的“01背包”。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
int N,M,t,v;
int f[1000+2];
int main(){
scanf("%d %d",&N,&M);
for(int i=1;i<=M;++i){
scanf("%d %d",&t,&v);
for(int j=N;j>=1;--j){
if(j<t)f[j]=f[j];
else f[j]=((f[j]>f[j-t]+v)?f[j]:(f[j-t]+v));
}
}
printf("%d\n",f[N]);
return 0;
}
本文通过C++代码详细解析了经典的01背包问题求解方法。利用动态规划思想,通过迭代更新状态数组来求得最大价值。适用于算法初学者及需要复习此知识点的读者。
646

被折叠的 条评论
为什么被折叠?



