首页 > 其他分享 >动态规划 背包问题

动态规划 背包问题

时间:2024-01-31 23:33:07浏览次数:26  
标签:main 背包 const int namespace using include 规划 动态

01背包

 

二维

//二维
#include<iostream>
#include<cmath>
using namespace std;
const int N=1010;
int p[N][N]={0};
int v[N];int w[N];
int m,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++){
            p[i][j]=p[i-1][j];//这一步不要忘记
            if(j>=v[i])
            p[i][j]=max(p[i-1][j],p[i-1][j-v[i]]+w[i]);
        }
    }
    cout<<p[n][m]<<endl;
    return 0;
}

一维

#include<iostream>
#include<cmath>
using namespace std;
const int N=1010;
int p[N]={0};
int v[N];int w[N];
int m,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=m;j>=v[i];j--){
            p[j]=max(p[j],p[j-v[i]]+w[i]);//每次更新后结果是此次最优解,并不是最终结果,下次求则利用这结果更新
        }
    }
    cout<<p[m]<<endl;
    return 0;
}

完全背包

 

 二维

#include<iostream>
#include<algorithm>
using namespace std;
const int N=1010;
int n,m;
int v[N],w[N];int p[N][N]={0};
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++){//正序即可
            p[i][j]=p[i-1][j];
            if(j>=v[i]) p[i][j]=max(p[i][j],p[i][j-v[i]]+w[i]);//注意是最新更新的最优解,而不是上一行最优解,因为可以重复利用
        }
    }
    cout<<p[n][m]<<endl;
    return 0;
}

一维

#include<iostream>
#include<algorithm>
using namespace std;
const int N=1010;
int n,m;
int v[N],w[N];int p[N]={0};
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=v[i];j<=m;j++){//正序即可
         p[j]=max(p[j],p[j-v[i]]+w[i]);//注意是最新更新的最优解,而不是上一行最优解,因为可以重复利用
        }
    }
    cout<<p[m]<<endl;
    return 0;
}

多重背包朴素写法

#include<iostream>
using namespace std;
const int N=1010;
int v[N],w[N],s[N];int p[N][N]={0};
int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>v[i]>>w[i]>>s[i];
    for(int i=1;i<=n;i++)
     for(int j=1;j<=m;j++)
      for(int k=0;k<=s[i];k++){
          //p[i][j]=p[i-1][j];没有这一步,因为枚举个数时就可能更新成更优解了
          if(j>=v[i]*k) p[i][j]=max(p[i][j],p[i-1][j-v[i]*k]+w[i]*k);
      }
      cout<<p[n][m]<<endl;
    return 0;

 二进制优化版

#include<iostream>
#include<algorithm>
using namespace std;
const int N=25000,M=2010;
int v[N],w[N];int p[M];
int n,m;
int main()
{
    cin>>n>>m;int cnt=0;
    for(int i=1;i<=n;i++){
        int a,b,s;
        cin>>a>>b>>s;
        int k=1;
        while(k<=s){
            cnt++;
            v[cnt]=a*k;
            w[cnt]=b*k;
            s-=k;
            k*=2;
        }
        if(s>0)
        {
            cnt++;
            v[cnt]=a*s;
            w[cnt]=b*s;
        }
    }
    n=cnt;
    for(int i=1;i<=n;i++)
        for(int j=m;j>=v[i];j--)
         p[j]=max(p[j],p[j-v[i]]+w[i]);
    cout<<p[m]<<endl;
    return 0;
}

 

标签:main,背包,const,int,namespace,using,include,规划,动态
From: https://www.cnblogs.com/daimazhishen/p/17817651.html

相关文章

  • 动态树直径小记
    本文采用BY-NC-SA协议发布。要求:给你一棵树,边带权,每次断边连边(保证合法且仍是树),在线求每次修改后的直径。LCT(咕)TopTree拆边,然后用negiizhao论文里的方法维护。实现时注意,翻转标记会影响合并的信息,要swap一下。#include<iostream>#include<unordered_map>#includ......
  • Vue 搭配GSAP实现颜色动态渐变
    重点使用reactive构造响应式的对象存储颜色,使用gsap.to操作响应式对象实现颜色渐变代码lettoTimeLine:TweenletoverTimeLine:TweentypeColor={value:string}typeTween=gsap.core.TweenconstaddItemColor=reactive<C......
  • 【京东云新品发布月刊】2024年1月产品动态来啦
     1)【莫奈可视化平台】新品上线京东莫奈可视化平台通过自由拖拽、图形化编辑、所见即所得的方式,快速实现极致酷炫、直观清晰的视觉场景,将海量繁杂数据背后所蕴含的价值更直观、深层、全面的展现出来,辅助决策者合理决策。2)【移动端应用监控SGM-mobile】新品上线移动端监控S......
  • [职场] 职业规划的重要性有些什么
    职业规划是一个非常重要的过程,它可以帮助个人更好地把握自己的职业方向,确定自己的最佳职业道路,提高个人素质和社会竞争力,实现个人职业成功和满足个人职业需求。一.重要性1.提升职业满意度当一个人有明确的职业目标和发展计划时,就会感到自己对未来的把控,进而提高职业满意度,相比之下,......
  • element实现大图预览和图片动态加载
    element的el-image组件支持大图预览模式,但需要和小图模式配合使用,项目中刚好有需求需要直接使用大图预览并且需要支持图片的动态加载,研究了一下el-image组件的源码发现el-image组件是通过引用image-viewer组件实现的大图预览的,刚好可以利用一下!image-viewer属性urlList:图......
  • 算法学习Day44完全背包
    Day44完全背包ByHQWQF2024/01/29笔记完全背包有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i]。每件物品都有无限个(也就是可以放入背包多次),求解将哪些物品装入背包里物品价值总和最大。和01背包的区别在每件物品都可以放入背包无......
  • 背包问题
    title:零钱兑换问题abbrlink:5322零钱兑换问题classSolution{public:intcoinChange(vector<int>&coins,intamount){intmax1=amount+1;vector<int>dp(amount+1,max1);dp[0]=0;for(inti=0;i<coin......
  • 动态 DP 学习笔记
    动态DPP4719动态DP给定一棵\(n\)(\(n\leqslant10^5\))个点的树,点带点权。有\(m\)(\(m\leqslant10^5\))次操作,每次操作给定\(x,y\),表示修改点\(x\)的权值为\(y\)。你需要在每次操作之后求出这棵树的最大权独立集的权值大小。首先考虑\(m=0\)时的做法,可以......
  • 【C语言进阶篇】动态内存常考笔试题
    (文章目录)......
  • 二维动态规划(下)
    二维动态规划(下)115.不同的子序列//自底向上intnumDistinct(char*s,char*t){constintMOD=1e9+7;intlenS=strlen(s);intlenT=strlen(t);//dp[i][j]表示在s中前缀长度为i的字符串所包含的所有子序列中,有多少个子序列等于t中前缀长度为j的......