笔记——01背包

来源:互联网 发布:仓库数据表格 编辑:程序博客网 时间:2024/05/22 01:54
/*
01背包
有n个物品,每个物品有重量w,价值v,现有一个m容量的背包,每个物品只能选一次
所能获得的最大价值为多少
dp[i][j],i表示当前的物品数,j为当前的重量,dp[i][j],在前i个物品,j的重量中所能获得的最大价值
那么dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i])
*/
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int w[105];
int v[105];
int dp[105][105];
int main(){
    int n,m;
    scanf("%d %d",&n,&m);
    for(int i=1;i<=n;i++){
        scanf("%d %d",&w[i],&v[i]);
    }
    memset(dp,0,sizeof(dp));
    for(int i=1;i<=n;i++){
        for(int j=m;j>=0;j--){
            if(j>=w[i]){
                dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]);
            }
            else dp[i][j]=dp[i-1][j];
        }
    }
    printf("%d\n",dp[n][m]);
    return 0;
}
原创粉丝点击