c++01背包一维数组版及java多重背包

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1010;
int c[maxn],w[maxn];
int dp[maxn];
int main(){
    int n,v;
    cin>>n>>v;
    for(int i=1;i<=n;i++) cin>>c[i];
    for(int i=1;i<=n;i++) cin>>w[i];

    for(int i=1;i<=n;i++){
        for(int j=v;j>=c[i];j--){                //为了防止之前的结果影响之后的必须从尾部向前走,因为这是01背包一维数组,每种物品只能选择一个
            dp[j]=max(dp[j],dp[j-c[i]]+w[i]);   //在完全背包下可以从前往后走,因为物品的个数是无限个,而多重背包与01背包一般情况下都可以相互转换的,所以多重只是对物品分了类而已相同的物品在一个类中,数量多了几个                                                //01背包则没有分类这一说,都是一样的
        }
    }
    printf("%d\n",dp[v]);
    return 0;
}
class Solution
{
   private int v[];   //价值
   private int c[];   //数量
   private int w[];   //体积
   private int num;   //物品的种数
   private int k;     //物品的总数
   private int dp[];  //最大价值表
   private int cnt;   //背包的最大容量
   private Scanner iner=new Scanner(System.in);

   public int Selected()
   {
    for(int i=0;i<this.k;++i)
    {
        for(int j=this.cnt;j>=this.w[i];--j)
        {
            dp[j]=Math.max(dp[j], dp[j-this.w[i]]+this.v[i]);
        }
    }
    return dp[this.cnt];
   }

   public Solution()
   {
       System.out.print("请输入背包的最大容量:");
       this.cnt=iner.nextInt();
       System.out.print("请输入物品的种数:");
        this.num=iner.nextInt();
        this.c=new int[this.num+100];
        this.w=new int[this.num+100];
        this.dp=new int[this.num+100];
        this.v=new int[this.num+100];
       System.out.print("请输入每种物品的价值体积及数量:");
       for(int i=0;i<this.num;++i)
       {
        this.v[i]=iner.nextInt();
        this.w[i]=iner.nextInt();
        this.c[i]=iner.nextInt();
       }
       this.k=this.num;
       for(int i=0;i<this.num;++i)
       {
        while(this.c[i]!=1)
        {
          this.v[k]=this.v[i];
          this.w[k]=this.w[i];
          this.c[i]--;
          this.c[k]=this.c[i];
          k++;
        }
       }
   }
}

原文地址:https://www.cnblogs.com/z2529827226/p/11629975.html

时间: 2024-10-13 16:54:21

c++01背包一维数组版及java多重背包的相关文章

poj 3624 (01背包一维数组)

①这种问题要看清楚变量范围 数组范围很容易开错!!! ②这个下限是w[i]!!!很重要 或者加一句判断  if(j-w[i]>=0)  1 for(int i=1;i<=t;i++) 2 { 3 for(int j=n;j>=w[i];j--)//下限!!! 4 dp[j]=max( dp[j] , dp[j-w[i]]+v[i] ); 5 } AC代码,一维数组可以压缩空间. 1 #include <cstdio> 2 #include <cstring> 3

HDU 1085 多重背包转化为0-1背包问题

题目大意: 给定一堆1,2,5价值的硬币,给定三个数表示3种价值硬币的数量,任意取,找到一个最小的数无法取到 总价值为M = v[i]*w[i](0<=i<3) 那么在最坏情况下M个数都能取到 , M+1必然取不到 所以给M+1个背包,往里面塞东西,最后由前往后检测,找到第一个无法取满的背包的体积 这道题目里,每一种物品的v*w必然小于M+1,所以不出现完全背包的情况,全部采用多重背包转化为0-1背包解决问题即可 1 #include <cstdio> 2 #include <

洛谷P2851 [USACO06DEC]最少的硬币The Fewest Coins(完全背包+多重背包)

题目描述 Farmer John has gone to town to buy some farm supplies. Being a very efficient man, he always pays for his goods in such a way that the smallest number of coins changes hands, i.e., the number of coins he uses to pay plus the number of coins he

Java知识系统回顾整理01基础06数组07数组工具类Arrays

一.Arrays简介 Arrays是针对数组的工具类,可以进行 排序,查找,复制填充等功能. 大大提高了开发人员的工作效率. ? ? 二.Arrays提供的数组复制方法 与使用System.arraycopy进行数组复制类似的, Arrays提供了一个copyOfRange方法进行数组复制. 不同的是System.arraycopy,需要事先准备好目标数组,并分配长度. copyOfRange 只需要源数组就就可以了,通过返回值,就能够得到目标数组了. 除此之外,需要注意的是 copyOfRan

【图文+视频新手也友好】Java一维数组详细讲解(内含练习题答案+详解彩蛋喔~)

目录 视频讲解: 一.数组的概述 二.一维数组的使用 三.Arrays工具类中的sort方法(sort方法用的多,我们具体讲一下) 四.数组中的常见异常 五.一维数组练习题 六.彩蛋(本期视频使用的PPT+[练习题(带答案和详解)]) [新手友好型视频]全面讲解Java一维数组(内含带答案和讲解的练习题彩蛋喔)看完即上手!更有详解版练习题来帮你加深印象~~ 视频讲解: 点击这里即可到小乔的B站观看 一.数组的概述 数组(Array),是存储一系列同类型数据元素的一种数据结构.它通过数组名和一个整

JAVA一维数组

import java.applet.Applet; import java.awt.*; //用*表示包含awt这个源包下的所有方法成员,awt为图形界面设计包 public class Applet_Example extends Applet{ int a[]; //定义一个一维数组 public void init(){ a=new int[5]; //定义一个一维数组,该数组包含5个元素 a[0]=100; //分别对数组元素赋值 a[1]=101; a[2]=102; a[3]=10

【华为OJ】201301 JAVA 题目0-1级 将数组分为相等的两组

描述:  编写一个函数,传入一个int型数组,返回该数组能否分成两组,使得两组中各元素加起来的和相等,并且,所有5的倍数必须在其中一个组中,所有3的倍数在另一个组中(不包括5的倍数),能满足以上条件,返回true:不满足时返回false. 知识点: 语言基础,字符串,循环,函数,指针,枚举,位运算,结构体,联合体,文件操作,递归    题目来源: 内部整理  练习阶段: 初级  运行时间限制: 10Sec 内存限制: 128MByte 输入: 输入输入的数据个数 输入一个int型数组 输出: 返

java数组(一维数组,二维数组)

数组初始化: 1,动态初始化:数组定义与为数组分配空间和赋值的操作分开进行 2,静态初始化:在定义数组的同时就为数组元素分配空间并赋值 3,默认初始化:数组是引用类型,它的元素相当于类的成员变量,因此,数组分配空间之后 每个元素也被按照成员的规则被隐士的初始化值 ------------------------------------------------. 一维数组: package day06; import java.util.Date; /*** * 数组演示 * 数组的声明: * t

java一维数组学习

/* * java学习: * 一维数组的使用: 声明语法 DataType[] name 或 DataType name[]. 初始化语法 DataType[] name = new DataType[length]. DataType[] name = new DataType[] { element1, element2, ...elementn }. DataType[] name = { element1, element2, ...elementn }. Java中使用关键字new创建