算法实验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();
            }
        }
    }
}

执行结果:
在这里插入图片描述

posted @ 2024-10-01 18:53  在天边偷看小天使  阅读(10)  评论(0)    收藏  举报  来源