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;
    }
  • 相关阅读:
    Shell xargs
    I2C总线图
    JS判断输入的字符串是否为数字
    CDN
    ④.linux基础之"字符集"
    01创建证书和环境准备
    梦的蒲公英
    java web项目部署遇到的jar cannot read的问题
    textbox icon jquery 插件
    解决双硬盘安装windows出现“安装程序无法定位现有系统分区,也无法创建新的系统分区”错误
  • 原文地址:https://www.cnblogs.com/longwind7/p/15490489.html
Copyright © 2011-2022 走看看