算法实验2-2
01背包问题
算法实验2-2,动态规划法实现01背包问题
~~明天上实验课,还有个任一点出发的tsp没做完,呜呜呜
(这个还要交实验报告,老师应该不查重吧,版权还是自个儿的,不可能自己抄自己么)
#include<bits/stdc++.h>
using namespace std;
int value[100][100] = {};
int path[100][100] = {};
vector<int> w;
vector<int> v;
int main()
{
int n, c, x;
cin >> n >> c;
for (int i = 0; i < n; i++)
{
cin >> x;
w.push_back(x);
}
for (int i = 0; i < n; i++)
{
cin >> x;
v.push_back(x);
}
for (int i = 1; i < n+1; i++)
{
for (int j = 1; j < c+1; j++)
{
if (w[i-1] > j)
{
value[i][j] = value[i - 1][j];
}
else
{
if (v[i - 1] + value[i - 1][j - w[i - 1]] > value[i - 1][j])
{
value[i][j] = v[i - 1] + value[i - 1][j - w[i - 1]];
path[i][j] = 1;
}
else
{
value[i][j] = value[i - 1][j];
}
}
}
}
for (int i = 0; i <n+1; i++)
{
for (int j = 0; j < c+1; j++)
{
printf("%6d ", value[i][j]);
}
cout << endl;
}
int i = n, j = c;
while (i > 0 && j > 0)
{
if (path[i][j] == 1)
{
path[i][j] = 999;
cout << "已经把第" << i << "个物品放入背包\n";
j = j - w[i - 1];
}
i--;
}
for (int i = 0; i < n + 1; i++)
{
for (int j = 0; j < c + 1; j++)
{
printf("%6d ", path[i][j]);
}
if (i != n)
{
cout << endl;
}
}
}
执行结果:

用Java实现(复习一下java基础语法使用)
package cn.ALAN_CF;
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// write your code here
Scanner input = new Scanner(System.in);
//物品个数n,背包容量c
int n = input.nextInt();
int c=input.nextInt();
//value[i][j]记录前i个物品放入容量为j的背包的最大价值
//path[i][j]==1 :第i个物品在容量为j的条件下被放入背包
int [][]value=new int[n+1][c+1];
int [][]path=new int[n+1][c+1];
int[] w = new int[n];
int[] v = new int[n];
for (int i=0;i<n;i++) {
w[i] = input.nextInt();
}
for (int i=0;i<n;i++) {
v[i] = input.nextInt();
}
Arrays.fill(value[0], 0);
for(int i=0;i<value.length;i++) {
value[i][0]=0;
}
for(int i=1;i<value.length;i++) {
for(int j=1;j<value[0].length;j++) {
if (w[i - 1] > j) {
value[i][j] = value[i - 1][j];
}
else {//j>=w[i-1]: value[i][j] = Math.max(value[i - 1][j], v[i - 1] + value[i - 1][j - w[i - 1]]);
if(value[i-1][j]<v[i-1]+value[i-1][j-w[i-1]]){
value[i][j]=v[i-1]+value[i-1][j-w[i-1]];
path[i][j]=1;
}
else{
value[i][j]=value[i-1][j];
}
}
}
}
for (int[] ints : value) {
for (int anInt : ints) {
System.out.printf("%6d ", anInt);
}
System.out.println();
}
int i=path.length-1;
int j=path[0].length-1;
while(i>0 && j>0) {
if(path[i][j]==1) {
System.out.println("已经装入第"+i+"个物品");
path[i][j]=999;
j=j-w[i-1];
}
i--;
}
for(int k=0;k<path.length;k++) {
for(int t=0;t<path[i].length;t++) {
System.out.printf("%3d ", path[k][t]);
}
if(k!=path.length-1) {
System.out.println();
}
}
}
}
执行结果:

浙公网安备 33010602011771号