动态规划—课堂笔记=>六种背包

01背包:

        有N件物品和一个容量为V的背包,放入第I件物品耗费的费用是wi,得到的价值是ci。求解哪些物品装入背包可以使价值总和最大?

​​​​​​​//二维01背包:
f[i][j]=max(f[i-1][j],f[i-1][j-w[i]]+c[i])
//一维01背包:
for(int i=1;i<=n;i++)//物品种类
 for(int j=m;j>=w[i];j--)//背包容量
  f[j]=max(f[j],f[j-w[i]]+c[i]);
:空间优化后的代码
#####################01背包要求全部装满########################
1)背包求最大价值时边界直接将数组初始化全部置0;
2)考虑“刚好装满条件”:
     一开始背包承重为0这种情况满足“装满条件”则f[0]=0;
     背包承重为j(j!=0)但不满足则f[j]=-0x3f3f3f3f//不可以赋值为0
     max 除了dp[0]=0  其他初始化为-0x3f3f3f3f
     min 除了dp[0]=0  其他初始化为0x3f3f3f3f
     不必恰好装满,全初始化为0
//####################>例题:
题目描述
Joe觉得云朵很美,决定去山上的商店买一些云朵,
商店里有n朵云,云朵被编号为1,2,……n,并且每朵云都有一个价值。
但是商店老板跟他说,一些云朵要搭配来买才好,所以买一朵云则与这朵云有搭配的云都要买,
但是Joe的钱有限,所以他希望买的价值越多越好。
输入:
        第1行n,m,w表示n朵云,m个搭配,Joe有w的钱。
        第2至n+1行,每行ci,di表示i朵云的价钱和价值。
        第n+2至n+1+m行,每行ui、vi表示买ui必须买vi,同理,如果买vi就必须买ui。
        30%的数据满足:n<=100;
        50%的数据满足:n<=1000;m<=100;w<=10000;
        100%的数据满足:n<=10000;0<=m<=5000;w<=10000;
输出:
    一行,表示可以获得的最大价值
+=====================================================
提示:并查集
1):
int fa[1000]
int init(){
    for(int i=1;i<=n;i++)fa[i]=i;
}
2):路径压缩:
int fd(int x){
    if(fa[x]!=x)return f[x]=fd(fa[x])
    else return x;
}
样例程序如下:
#include<bits/stdc++.h>
#define quickly() ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
const int N=1e4+10;
int n,m,c,v[N],w[N],f[N],p[N]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值