#include <stdio.h>
#include <algorithm>
using namespace std;
struct good{
int w;//重
int v;//价值
}good[101];
int dp[101][1001];//状态数组
int main(){
int s,n;//价值 数量
while(scanf("%d%d",&s,&n)!=EOF){
for(int i=1;i<=n;i++)
scanf("%d",&good[i].w,&good[i].v);
for(int i=0;i<=s;i++)
dp[0][i]=0;//初始化,初始没有物品时总体积不超过j时最大价值为0
for(int i=1;i<=n;i++){
for(int j=s;j>=good[i].w;j--)//对s到good[i].w之间的任何一个j转移来源为dp[i-1][j]或dp[i-1][j-good[i].w]+good[i].v,取其中较大者
dp[i][j]=max(dp[i-1][j],dp[i-1][j-good[i].w]+good[i].v);
for(int j=good[i].w-1;j>=0;j--)//当不超过的j小于下一物品的重量时,该物品不能被放入
dp[i][j]=dp[i-1][j];
}
printf("%d\n",dp[n][s]);
}
return 0;
}
由状态转移数组知:dp[i][j]与dp[i-1][j]或dp[i-1][j-good[i].w]+good[i].v有关,即该位状态与上位状态有关,所以状态数组可以改为一维数组:
dp[j]=max(dp[j],dp[j-good[i].w]+good[i].v)
#include <stdio.h>
#include <algorithm>
using namespace std;
struct good{
int w;//重
int v;//价值
}good[101];
int dp[1001];//状态数组
int main(){
int s,n;//价值 数量
while(scanf("%d%d",&s,&n)!=EOF){
for(int i=1;i<=n;i++)
scanf("%d%d",&good[i].w,&good[i].v);
for(int i=0;i<=s;i++)
dp[i]=0;//初始化,初始没有物品时总体积不超过j时最大价值为0
for(int i=1;i<=n;i++)
for(int j=s;j>=good[i].w;j--)//对s到good[i].w之间的任何一个j转移来源为dp[i-1][j]或dp[i-1][j-good[i].w]+good[i].v,取其中较大者
dp[j]=max(dp[j],dp[j-good[i].w]+good[i].v);
printf("%d\n",dp[s]);
}
return 0;
}
来源:CSDN
作者:缘奈酱
链接:https://blog.csdn.net/qq_44249650/article/details/104075900