模板 01背包

【模板】01背包

 1 # include <stdio.h>
 2 # include <stdlib.h>
 3 # include <string.h>
 4 # define max(x,y) x>y?x:y;
 5 int v[1001];//价值
 6 int w[1001];//重量
 7 int dp[1001][1001];
 8 int main()
 9 {
10     int n,m;
11     while(scanf("%d%d",&m,&n)!=EOF)
12     {
13         memset(dp,0,sizeof(dp));//初始化
14         for(int i=1; i<=n; i++)
15             scanf("%d%d",&w[i],&v[i]);
16         for(int i=1; i<=n; i++) // 物品数
17             for(int j=m; j>=w[i]; j--) //放入背包
18                 dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]);// 与前面对比
19         printf("%d\n",dp[n][m]);
20     }
21 }
22
23 //01背包第K优解问题
24 struct pack
25 {
26     int v;//体积
27     int w;//价值
28 }node[length];
29
30 for(i = 0;i<n;i++)
31 {
32     for(j = v;j>=node[i].v;j--)
33     {
34         for(d = 1;d<=k;d++)
35         {
36             a[d] = dp[j-node[i].v][d] + node[i].w;
37             b[d] = dp[j][d];
38         }
39         x = y = z = 1;
40         a[d] = b[d] = -1;
41         while(z<=k && (x<=k || y<=k))
42         {
43             if(a[x]>b[y])
44             dp[j][z] = a[x++];
45             else
46             dp[j][x] = b[y++];
47             if(dp[j][z]!=dp[j][z-1])
48             z++;
49         }
50     }
51 }
52 //dp[v][k]为第K优解,例题:HDU2639
时间: 2024-12-13 06:22:05

模板 01背包的相关文章

hdu 2602 Bone Collector(01背包)

Bone Collector Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 42179    Accepted Submission(s): 17543 Problem Description Many years ago , in Teddy’s hometown there was a man who was called “Bon

1085 背包问题(0-1背包模板题)

1085 背包问题(0-1背包模板题)(51NOD基础题) 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 在N件物品取出若干件放在容量为W的背包里,每件物品的体积为W1,W2--Wn(Wi为整数),与之相对应的价值为P1,P2--Pn(Pi为整数).求背包能够容纳的最大价值. Input 第1行,2个整数,N和W中间用空格隔开.N为物品的数量,W为背包的容量.(1 <= N <= 100,1 <= W <= 10000) 第2 - N + 1行,每行

01背包 模板1 2 总结

物品质量 w[0] w[1]  w[2] ....... w[n]                背包容量c               T 物品价值 v[0]  v[1]  v[2]  .......  v[n]              物品种类 n                N (一)设DP(x,y)   表示  从前x项物品中  取出装入  体积为y的背包 的  物品的最大价值. 前x项物品(0---- x-1 , X)   去装          体积容量为y的背包 |------

01背包模板、全然背包 and 多重背包(模板)

转载请注明出处:http://blog.csdn.net/u012860063 贴一个自觉得解说不错的链接:http://www.cppblog.com/tanky-woo/archive/2010/07/31/121803.html 模版就直接贴代码: 01背包模板: /* 01背包问题 01背包问题的特点是,">每种物品仅有一件.能够选择放或不放. 01背包问题描写叙述: 有N件物品和一个容量为V的背包. 第i件物品的重量是c[i],价值是w[i]. 求解将哪些物品装入背包可使这些物品

01背包 模板1

// 0-1背包问题的普通递归算法#include <stdio.h>#define M 10int w[M]={5,3,2,1},v[M]={4,4,3,1};int limit_w=7,maxv=0,n=4; void find(int i,int tw,int tv) //从第i种物品开始,当前已有的重量tw和价值tv{ if (i<n) //进入第i+1件的条件,还没有选完n种物品 if (tw+w[i]<=limit_w ) //选择第i件物品 find(i+1,tw+w

01背包模板

转载请注明出处:http://blog.csdn.net/u012860063 模版就直接贴代码: 01背包问题 01背包问题的特点是,每种物品仅有一件,可以选择放或不放. 01背包问题描述: 有N件物品和一个容量为V的背包.第i件物品的重量是c[i],价值是w[i]. 求解将哪些物品装入背包可使这些物品的重量总和不超过背包容量,且价值总和最大. #include <stdio.h> int max(int x,int y) { int M; M=x>y ? x : y; return

动规讲解基础讲解一——01背包(模板)

作为动态规划的基础,01背包的思想在许多动规问题中会经常出现,so,熟练的掌握01背包的思路是极其重要的: 有n件物品,第i件物品(I = 1,2,3…n)的价值是vi, 重量是wi,我们有一个能承重为m的背包,我们选择一些物品放入背包,显然放入背包的总重量不超过m.我们要求选择物品的总价值最大,请问如何选择?这里我们假设所有出现的数都是正整数. 第一想法是? (1) 枚举?万能的枚举啊.但对于n件物品,每件都可以选择取或者不取,总的可能性有2n, n = 30就大约已经有10亿种可能了!枚举所

【01背包】HDU 2602 Bone Collector (模板题)

Problem Description Many years ago , in Teddy's hometown there was a man who was called "Bone Collector". This man like to collect varies of bones , such as dog's , cow's , also he went to the grave -The bone collector had a big bag with a volum

01背包【模板】

01背包是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放.用子问题定义状态:即F[i,v] 表示前i 件物品恰放入一个容量为v 的背包可以获得的最大价值.则其状态转移方程便是: F[i,v]=max(F[i,v],F[i-1,v-w[i]]+v[i]) 这个方程非常重要,基本上所有跟背包相关的问题的方程都是由它衍生出来的.所以有必要将它详细解释一下:"将前i 件物品放入容量为v 的背包中"这个子问题,若只考虑第i 件物品的策略(放或不放),那么就可以转化为一个只和前 i