当前位置:网站首页>Une solution complète au problème du sac à dos dans la programmation dynamique
Une solution complète au problème du sac à dos dans la programmation dynamique
2022-07-23 16:30:00 【Arrondir au petit matin de deux mètres de haut】
Dans l'article précédent, nous avons appris ce qu'est un problème de programmation dynamique et ce qu'est un problème de sac à dos,Et analysé01Sac à dos,Si vous souhaitez lire l'article précédent, veuillez passer à–>Problème de sac à dos01Détails du sac à dos,Aujourd'hui, regardons le problème du sac à dos le problème complet du sac à dos.
Catalogue des articles
Un.、Qu'est - ce qu'un problème de sac à dos complet?
Oui.nArticle (s),Le volume unitaire de chaque article est dev[i],Valeur:w[i].Une capacité existante estVSac à dos,Demandez comment choisir les articles à mettre dans votre sac à dos,Maximiser la valeur totale des articles dans le sac à dos.Chacun de ces objets est infini.
Sac à dos complet et01La différence entre les sacs à dos:
- 01Le sac à dos ne peut être sélectionné qu'une seule fois ou pas lors du choix d'un article
- Le sac à dos complet ne peut pas être sélectionné lors du choix d'un article , Vous pouvez aussi choisir une fois , Deux fois. ... Il n'y a pas de limite supérieure au nombre de sélections ( Tant que le sac à dos peut être posé )
2.、Analyse des exemples
1. Titre:

2. Analyse:
2.1 Première étape:Déterminer les variables d'état(Fonctions)
La valeur maximale estNombre d'articlesiEtCapacité du sac à dosjFonction de.
Définir la fonctionf[i][j]Indique avantiLes articles ont une capacité dejLa valeur maximale du sac à dos.
La valeur maximale finale est le nombre d'articlesiDe0Croissance àn,Capacité du sac à dosjDe0Croissance àmHeuref[n][m]Valeur.
2.2 Deuxième étape:Déterminer l'équation de transfert d'état
Variables d'état:f[i][j]Indique avantiLes articles ont une capacité dejLa valeur maximale du sac à dos
La capacité actuelle estj,Nous devons tenir compte de laiArticle (s)Peut - on insérer?Oui Non?
- Si la capacité actuelle du sac à dos j<v[i],Impossible de placer,Etf[i][j]=f[i-1][j]
- Si la capacité actuelle du sac à dos j>=v[i], Peut être placé mais à un coût comparable
2.1 SiiLes articles ne sont pas mis dans le sac à dos,Etf[i][j]=f[i-1][j]
2.2 SiiMettez un article dans votre sac à dos,Etf[i][j]=f[i][j-v[i]]+w[i]
AvantiArticle (s),La capacité du sac à dos estj-v[i] Peut avoir été placé dans le iArticle (s),Capacité:j Il peut également être placé dans iArticle (s),Alors utilisezf[i][j-v[i]]Mise à jourf[i][j]
Équation de transfert d'état:
Peut être représenté comme :
2.3 Conditions limites
Pour01 Le sac à dos dit que la limite est f[i][j]=0,C'est - à - direi=0Ouj=0Heuref[i][j]La valeur de0.
i=0Heure, Ça veut dire qu'il n'y a pas d'article dans le sac à dos , Il n'y a donc aucun moyen de parler de la valeur maximale du sac à dos ,Donc pour0;
j=0Heure, Indique que la capacité du sac à dos est 0, Il n'est donc pas possible de mettre l'article en ce moment , Donc la valeur maximale est aussi 0;
3. Représentation du processus
3.1 Code de base
for(int i=1;i<=n;i++){
//Articlesi
for(int j=0;j<=m;j++)
{
if(j<v[i])
f[i][j]=f[i-1][j];
else
f[i][j]=max(f[i-1][j],f[i][j-v[i]]+w[i]);
}
}
cout<<f[n][m]<<endl;
3.2 Calcul manuel

3.3 Vérification du Code

3.4 Code complet
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1010;
int n,m;
int v[N],w[N];
int f[N][N];
int main ()
{
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>v[i]>>w[i];
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
if(j<v[i])
f[i][j]=f[i-1][j];
else
f[i][j]=max(f[i-1][j],f[i][j-v[i]]+w[i]);
}
cout<<f[n][m]<<endl;
return 0;
}
3.5 Optimisation
Optimiser la représentation bidimensionnelle en une dimension , Réduire l'utilisation de l'espace ,Avec un tableau unidimensionnelf[j]Enregistrer une seule ligne de données,JeanjCycle de séquence des valeurs,Mise à jour séquentiellef[j]
Code optimisé
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1010;
int n,m;
int v[N],w[N];
int f[N];
int main ()
{
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>v[i]>>w[i];
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
if(j<v[i])
f[j]=f[j];
else
f[j]=max(f[j],f[j-v[i]]+w[i]);
}
cout<<f[m]<<endl;
return 0;
}
Parce quej C'est une boucle séquentielle ,f[j-v[i]]Avantf[j]Mise à jour,C'est - à - dire, Avec une nouvelle valeur f[j-v[i]]Pour mettre à jourf[j], C'est l'équivalent de iD'accord.f[j-v[i]]Mise à jour de la valeurf[j],Donc C'est vrai..
边栏推荐
- Go 接口:深入内部原理
- SOC的第一个Hello_World实验
- AC automata and fail tree
- Go language learning - Review package, interface, file operation
- WSAStartup函数的用途
- 7、 Logic of JMeter sending request
- 946. Verify stack sequence ●● & sword finger offer 31. stack push in and pop-up sequence ●●
- table自定义表格的封装
- VRRP+MSTP配置详解【华为eNSP实验】
- Niuke-top101-bm35
猜你喜欢

反转链表画图演示

MySQL - six logs

IIS 部署.NetCore

机器狗背冲锋枪射击视频火了,网友瑟瑟发抖:stooooooooppppp!

Bean Validation起源篇----01
10": potential combination of no code / low code and RPA Technology"/>"1+1 > 10": potential combination of no code / low code and RPA Technology

table自定义表格的封装

Leetcode high frequency question: the array can be changed into a non descending state after at least several operations

Go 接口:深入内部原理

移动端H5 - 手撸一个生命线 timeline
随机推荐
V自P建N_部署使用
Niuke-top101-bm35
[2023 approved in advance] BOE
Oracle中实现删除指定查询条件的所有数据
Bean Validation核心組件篇----04
Basic concept and deployment of kubernetes
Flutter | firstWhere 报错问题
Bean Validation核心组件篇----04
阿里二面:MySQL 啥时候用表锁,啥时候用行锁?
JS filter / replace sensitive characters
数据库的备份和还原
High cost performance, high anti-interference touch IC that meets a variety of keys: vk3606d, vk3610i, vk3618i have high power voltage rejection ratio
[cloud native] continuous integration and deployment (Jenkins)
Go 接口:深入内部原理
千万别让富坚义博看到这个
SOC的第一个Hello_World实验
Packaging and use of alamofire framework
Ali Er Mian: when does MySQL use table locks and row locks?
GO语言学习——复习包、接口、文件操作
15001.系统设计方案