背包问题

耗尽温柔 提交于 2020-01-23 21:49:33

在这里插入图片描述

#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;
}

在这里插入图片描述

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!