DP——背包问题(二)

01背包大家一定都会……

但如果01背包的W很大怎么办……

此时我们观察,若v[i]很小,我们可以考虑建立有关v[i]的方程

方程内容大概是:在达到某一v时,所需的总w最小

说多了不如上代码:

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<string>
 6 #include<algorithm>
 7 using namespace std;
 8 int n,m,sumv,ans;
 9 int dp[300][234000],w[500],v[500],wi,vi;
10 int a[300];
11 int main(){
12     scanf("%d %d",&n,&m);
13     for(int i=1;i<=n;i++) scanf("%d %d",&w[i],&v[i]);
14     for(int i=1;i<=n;i++) sumv+=v[i];
15     for(int j=0;j<=sumv;j++) dp[0][j]=200000000;
16     for(int i=1;i<=n;i++)
17     for(int j=sumv;j>=1;j--){
18         wi=w[i];
19         vi=v[i];
20         if(j<=v[i]) dp[i][j]=min(dp[i-1][j],w[i]);
21         else{
22             dp[i][j]=dp[i-1][j];
23             dp[i][j]=min(dp[i][j],dp[i-1][j-v[i]]+w[i]);
24         }
25     }
26     for(int i=1;i<=sumv;i++) if(dp[n][i]<=m) ans=i;
27     printf("%d\n",ans);
28     return 0;
29 }
时间: 2024-12-23 14:00:06

DP——背包问题(二)的相关文章

hdu 4901 The Romantic Hero (dp+背包问题)

题意: 有n个数,从n个数中选出两个集合s和集合t,保证原序列中,集合s中的元素都在 集合t中元素的左边.且要求集合s中元素做抑或运算的值与集合t中元素做与运算的 值相等.问能选出多少种这样的集合s和t. 算法: 左右dp. 用dp[i][j]表示前i个数 做抑或运算得到j的方法数.最后一个值取不取到都不一定. 故为背包的问题.右边也是一样. 枚举时可能出现重复.枚举到第i个和枚举第i+1个可能重复.所以要枚举一个中间值. 这个中间值是归到s集的,因为抑或支持逆运算,而与是不支持的. 所以最后d

dp背包问题/01背包,完全背包,多重背包,/coin change算法求花硬币的种类数

一步一步循序渐进. Coin Change 具体思想:给你 N元,然后你有几种零钱S={S1,S2...,Sm} (每种零钱数量不限). 问:凑成N有多少种组合方式  即N=x1 * S1+x2*S2+...+xk*Sk (xk>=0,k=1,2..m) 设有f(x)中组合方式 有两种解答(自底向上回溯): 1.不用第m种货币   f(N,m-1) 2.用第m种货币 f(N-Sm,m) 总的组合方式为f(N,m)=f(N,m-1)+f(N-Sm,m) anything is nonsense,s

hdu 1203 dp背包问题

一个背包问题将价值变成了概率,求最小的一个收不到的概率,然后用1减去就可以啦! #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <set> #include <map> #include <string>

DP——背包问题(一)

以前不是很重视 DP ,遇到 DP 就写贪心.暴搜--其实这是非常错误的,现在开始练习 DP 了才发现,我好菜-- 对于DP的整理,先从众所周知的背包问题开始. -------- 01背包:n 个物品,重量和价值分别为 w[i].v[i],背包容量 W,求所有挑选方案中价值总和的最大值. DP 方程 :dp[j] = max ( dp[j] , dp[ j - w[i] ] + v[i] ) ,其中 dp[j]为使用 j 的容量获得的最大价值,i 为第 i 件物品. 代码: 1 #include

[DP] 背包问题大总结

@kaike 1.01背包 有N件物品和一个容量为C的背包.第i件物品的重量是w[i],价值是v[i].求解将哪些物品装入背包可使价值总和最大. 每种物品仅有一件,可以选择放还是不放. 用f[i][c]表示前i件物品恰好放入容量为c的背包里面,总价值最大. f[i][c]=max{f[i-1][c],f[i-1][c-w[i]]+v[i]} 若不放第i件,就是前i-1件物品放入容量为c的背包里 f[i-1][c] 若放第i件,把前i-1件物品放入容量为 c-w[i] 的背包里,f[i-1][c-

HDU 1561 树形DP背包问题

这是自己第一道背包上树形结构问题,不是很理解这个概念的可以先看看背包九讲 自己第一次做,看了一下别人的思路,结合着对简单背包问题的求解方式自己一次AC了还是有点小激动的 题目大意是: 攻克m个城市,每个城市都有对应数量的宝贝,攻克某一个城市必须保证其对应的某一个特定城市已经被攻克,希望得到最多数量的宝贝 很容易根据题目画出一个对应关系的树形结构,每个节点都有一个对应的宝物的数量 我们用dp[i][j]存 i 号节点它下方子树中 有 j 个城市被攻克时得到的宝物最大数量 , 此时的 i 号是没有被

dp【二维动归】 jzojp1295

一道比较典型的二维动归题目 但我在打的时候没有推出来简洁的动归表达式0.0,有点搜索的味道,所有时间花的有点多 但只要优化一下就好了 #include<iostream> #include<string> #include<cstring> #include<algorithm> using namespace std; int num[3000][3000]; int hh[3000][3000]; int ll[3000][3000]; int f[30

动态规划学习系列——划分DP(二)

划分型DP第二题,wikioi 1039,与第一题乘积最大思路有所不同. 题目要求: 将一个数划分成几部分,问一共有多少种分法. 真 · 解题思路: 其实跟小学奥赛的一些题有点像,我们先来看一个例子: 7 分成 3 部分,有四种办法: 1,1,5:1,2,4:1,3,3:2,2,3 . 我们人脑来考虑问题的时候是怎么想的呢?显然,从1开始,1是第1部分,然后剩下6分成2部分,我们依然是从1开始考虑,1是第2部分,然后5是第3部分:同样接下来考虑第2部分是2,则第3部分是4:接着考虑第2部分是3,

Vijos1392拼拼图的小衫[背包DP|二维信息DP]

背景 小杉的幻想来到了经典日剧<死亡拼图>的场景里……被歹徒威胁,他正在寻找拼图(-.-干嘛幻想这么郁闷的场景……). 突然广播又响了起来,歹徒竟然又有了新的指示. 小杉身为新一代的汤浅,有责任带领大家脱离危险! (若对情节有任何疑问,请观看原剧) 描述 歹徒告诉小杉,他正在寻找的拼图块其实可以拼成N个 有顺序的 完整的拼图. 每个完整的拼图由若干个拼图块组成. 歹徒要求小杉把拼图按拼出的顺序划分成M个集合,一个拼图集合由若干个完整的拼图组成,并且总的拼图块的数目不超过T.并且,构成集合的拼图