zoukankan      html  css  js  c++  java
  • 动态规划 01背包问题

    题目链接:https://www.acwing.com/problem/content/2/
    题目
    有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。

    第 i 件物品的体积是 vi,价值是 wi。

    求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
    输出最大价值。

    输入格式
    第一行两个整数,N,V,用空格隔开,分别表示物品数量和背包容积。

    接下来有 N 行,每行两个整数 vi,wi,用空格隔开,分别表示第 i 件物品的体积和价值。

    输出格式
    输出一个整数,表示最大价值。

    数据范围
    0<N,V≤1000
    0<vi,wi≤1000
    输入样例
    4 5
    1 2
    2 4
    3 4
    4 5
    输出样例:
    8

    题解

    #include<bits/stdc++.h>
    using namespace std;
    int n,v;   //n表示物品数量,v表示背包容积 
    int V[1001];//表示每个物品的体积 
    int W[1001];//表示每个物品的价值
    int dp[1001][1001];//二维动态规划数组 
    /*
    dp数组的意义:dp[i][j]表示,在前i个物品中,当体积为j时能装入背包的最大价值 
    体积和价值数组的下标均从1开始而不是0 ,因为dp[0][0]=0需要参与递推方程的计算 
    */ 
    int main()
    {
    	cin>>n>>v;
    	for(int i=1;i<=n;i++)
    		cin>>V[i]>>W[i];
    	for(int i=1;i<=n;i++){
    		for(int j=1;j<=v;j++){
    			if(V[i]>j) //当前体积无法装下该物品,则无需考虑
    			dp[i][j]=dp[i-1][j];//因为无法装下该物品,则该体积下能装入的最大价值和没有这个物品时是一样的 
    			else dp[i][j]=max(dp[i-1][j],dp[i-1][j-V[i]]+W[i]);//状态转移方程
    		}
    	}
    	cout<<dp[n][v];
    	return 0;
    }
  • 相关阅读:
    Tomcat:基础安装和使用教程
    java部署
    tomcat 配置访问路径 server.xml配置去掉项目名称 .
    linuxACL控制
    Your PHP installation appears to be missing the MySQL
    ssh报错
    502 Bad Gateway
    单点登录SSO
    tomcat详细介绍
    详解redis5.x版本
  • 原文地址:https://www.cnblogs.com/longwind7/p/15490489.html
Copyright © 2011-2022 走看看