代码实现
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxc = 1010;
const int maxn = 110;
int c;
int n;
int v[maxn];
int w[maxn];
int dp[maxc];
int main(){
while(scanf("%d ",&c)!=EOF){
scanf("%d",&n);
fill(v,v+maxn,0);
fill(w,w+maxn,0);
fill(dp,dp+maxc,0);
for(int i=1;i<=n;i++){
scanf("%d %d",&w[i],&v[i]);
}
for(int i=1;i<=n;i++){
for(int j=c;j>=w[i];j--){
dp[j] = max(dp[j-w[i]]+v[i],dp[j]);
}
}
printf("%d\n",dp[c]);
}
return 0;
}
码后反思
- 动规问题非常看重初始化~毕竟要一步一步推理,当然初始化的起点很重要啦,不然从哪里开始推理呢?
- 背包问题,建议数组下标从1开始,而不是从0开始。。。