c++01背包一维数组版及java多重背包
Posted z2529827226
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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++;
以上是关于c++01背包一维数组版及java多重背包的主要内容,如果未能解决你的问题,请参考以下文章