当前位置: 首页 > article >正文

GESP6级语法知识(六):(动态规划算法(六)多重背包)

多重背包(二维数组)

#include <iostream>
using namespace std;
#define N 1005
int Asd[N][N];       //Asd[i][j]表示前 i 个物品,背包容量是 j 的情况下的最大价值。
int Value[N], Vol[N], S[N];
 
int main()
{
	int n, Volume;
	cin >> n >> Volume;
	for(int i = 1; i <= n; i++)
		cin >> Vol[i] >> Value[i] >> S[i];
 
	for(int i = 1; i <= n; i++) {              //n个物品
		for(int j = 1; j <= Volume; j++) {     //Volume是容量
			for(int k = 1; k <= S[i] && j >= k*Vol[i]; k++){
				Asd[i][j] = Asd[i-1][j]; 
				if(j >= Vol[i]) 
					Asd[i][j] = max(Asd[i][j], Asd[ i-1 ][ j- k*Vol[i] ] + k*Value[i]);
			}
		} 
	}
 
	cout << Asd[n][Volume] <<endl;
	return 0;
}

多重背包(一维数组)

#include <iostream>
using namespace std;
#define N 1005
int Asd[N]; 
int Value[N];
int Vol[N];
int S[N];
 
int main()
{
	int n, Volume;
	cin >> n >> Volume;
	for(int i = 1; i <= n; i++)
		cin >> Vol[i] >> Value[i] >> S[i];
 
	for(int i = 1; i <= n; i++){
		for(int j = Volume; j >= Vol[i]; j--){
			for(int k = 1; k <= S[i] && j >= k*Vol[i]; k++)
				Asd[j] = max(Asd[j], Asd[ j - k*Vol[i] ] + k*Value[i]);
		} 
	}
	cout<< Asd[Volume] <<endl;
	return 0;
}

例题一(二维数组)

#include<bits/stdc++.h>
int max(int a,int b)
{
    return a>b?a:b;
}
int main()
{
    int p[105],h[105],c[105],f[105][105];
    int t;
    scanf("%d",&t);
    while (t--)
    {
        int n,m;
        scanf("%d%d",&n,&m);
        int i,j,k;
        for (i=1;i<=m;i++)
            scanf("%d%d%d",&p[i],&h[i],&c[i]);
        memset(f,0,sizeof(f));
        for (i=1;i<=m;i++)
           for (j=1; j<=n; j++)
              for (k=0; k<=c[i] &&  k*p[i] <=j; k++)
                 f[i][j]=max(f[i][j],f[i-1][j-k*p[i]]+k*h[i]);
        printf("%d\n",f[m][n]);
    }
    return 0;
}

例题一(一维数组)

#include<bits/stdc++.h>
int max(int a,int b)
{
    return a>b?a:b;
}
int main()
{
    int p[105],h[105],c[105],f[105];
    int t;
    scanf("%d",&t);
    while (t--)
    {
        int n,m;
        scanf("%d%d",&n,&m);
        int i,j,k;
        for (i=1;i<=m;i++)
            scanf("%d%d%d",&p[i],&h[i],&c[i]);
        memset(f,0,sizeof(f));
        for (i=1;i<=m;i++)
            for (j=n;j>=0;j--)
                 for (k=0; k<=c[i] &&  k*p[i] <=j; k++)
                    f[j]=max(f[j],f[j-k*p[i]]+k*h[i]);
        printf("%d\n",f[n]);
    }
    return 0;
}

例题一(二进制优化)

#include<bits/stdc++.h>
int max(int a,int b)
{
    return a>b?a:b;
}
int main()
{
    int p[105],h[105],c[105],f[105];
    int t;
    scanf("%d",&t);
    while (t--)
    {
        int n,m;
        scanf("%d%d",&n,&m);
        int i,j,k;
        for (i=1;i<=m;i++)
            scanf("%d%d%d",&p[i],&h[i],&c[i]);
        memset(f,0,sizeof(f));
        for (i=1; i<=m; i++)
        {
            int  s =c[i];
            for  (j=1; j<=s;  s-=j, j=j*2)    // 二进制拆分
            {
                for  (k =n; k >=0 && k>= j*p[i]; k--)  // 0/1背包
                {
                    f[k] = max(f[k], f[k - j*p[i]] + j *h[i]);
                }
            }
            if (s > 0)          // 拆分的剩余部分
            {
                 for  ( j =n; j >= s * p[i]; j--)
                 {
                    f[j] = max(f[j], f[j - s * p[i]] + s * h[i]);
                 }
            }
        }
        printf("%d\n",f[n]);
    }
    return 0;
}


http://www.kler.cn/a/532519.html

相关文章:

  • 25.02.04 《CLR via C#》 笔记14
  • 怀旧经典:1200+款红白机游戏合集,Windows版一键畅玩
  • Docker使用指南(一)——镜像相关操作详解(实战案例教学,适合小白跟学)
  • 【数据结构】(4) 线性表 List
  • 股票入门知识
  • 差值 dp 入门
  • 爬虫学习笔记之Robots协议相关整理
  • C++模板编程——可变参类模板
  • IOS开发日志-ios新建项目后-将storyboard去掉,版本调整为IOS13以下
  • 关于算尽圆周率
  • 使用 Go 语言调用 DeepSeek API:完整指南
  • 泰山派Linux环境下自动烧录脚本(EMMC 2+16G)
  • 手写MVVM框架-模板渲染1
  • 什么是REStful API,其设计核心原则(core principle)是什么
  • 深入解析 Redis AOF 机制:持久化原理、重写优化与 COW 影响
  • MyBatis 初级
  • 基于SpringBoot的物资管理系统
  • 面经--C语言——内存泄漏、malloc和new的区别 .c文件怎么转换为可执行程序 uart和usart的区别 继承的访问权限总结
  • 蓝桥杯python基础算法(2-2)——基础算法(F)——差分
  • 【CPP】异步操作的底层原理与应用举例
  • 一文速览DeepSeek-R1的本地部署——可联网、可实现本地知识库问答:包括671B满血版和各个蒸馏版的部署
  • 基于springboot+vue的中药实验管理系统(源码+数据库+文档)
  • LeetCode --- 434周赛
  • kubernetes学习-配置管理(九)
  • 【Linux探索学习】第二十八弹——信号(下):信号在内核中的处理及信号捕捉详解
  • vscode搭建git