时隔一年再看背包问题感觉自己对此类问题又有更深入的了解(大神莫喷)
能找出上面黑图的规律就应该可以把这个算法理解了
该图是自左向右,自上往下来看,其实这个顺序理解了随便什么顺序都可以
算法的核心思想就是这个物品该不该放,若使背包有更高的价值就把这个物品放进去,反之不放,但前提是不能超过背包最大重量
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int dp[201][5001];
int main()
{
int n,W;
int w[201];
int v[201];
scanf("%d %d",&n,&W);
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++){
scanf("%d %d",&w[i],&v[i]);
}
for(int i=1;i<=n;i++){
for(int j=0;j<=W;j++){
if(w[i]<=j){
dp[i][j] = max(dp[i-1][j-w[i]]+v[i],dp[i-1][j]);
}else
dp[i][j] = dp[i-1][j];
}
}
//printf("number\tweight\tvalue\t1\t2\t3\t4\t5\n");
//for(int i=1;i<=n;i++){
//printf("%d\t%d\t%d\t",i,w[i],v[i]);
//for(int j=1;j<=W;j++){
//printf("%d\t",dp[i][j]);
//}
//printf("\n");
//}
printf("%d\n",dp[n][W]);
return 0;
}