hdu2191(完全背包)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2191

完全背包:

 1 #include <iostream>
 2 #include<algorithm>
 3 #include<cstring>
 4 using namespace std;
 5 int t,n,m;
 6 int v[1110],w[1110],num[1110];
 7 int dp[1110];
 8 int main()
 9 {
10    cin>>t;
11    while(t--)
12    {
13         int ans=0;
14         cin>>n>>m;
15         for(int i=0;i<m;i++)
16         cin>>v[i]>>w[i]>>num[i];
17         memset(dp,0,sizeof(dp));
18         for(int i=0;i<m;i++)
19             {
20                 int nu=num[i];
21                 for(int k=1;nu>0;k*=2)    //二进制划分
22                 {
23                     int tmp=min(k,nu);
24                     for(int j=n;j>=tmp*v[i];j--)
25                     dp[j]=max(dp[j],dp[j-tmp*v[i]]+tmp*w[i]);
26                     nu-=tmp;
27                 }
28             }
29     for(int i=0;i<=n;i++)
30         ans=max(ans,dp[i]);
31     cout<<ans<<endl;
32    }
33 }
时间: 2024-08-06 13:45:20

hdu2191(完全背包)的相关文章

hdu2191 多重背包

题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=2191 多重背包:有N种物品和一个容量为V的背包.第i种物品最多有n[i]件可用,每件费用是c[i],价值是w[i]. 求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大. 有两种思路,其中一种是转换为01背包,还有一种就是转换为01背包和完全背包. 转换为01背包代码: //转换为01背包的代码 #include<iostream> #include<al

hdu2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 (这个只是题目名字) (多重背包)

本文出自:http://blog.csdn.net/svitter 原题:http://acm.hdu.edu.cn/showproblem.php?pid=2191 题意:多重背包问题.转换成为01背包解.多重背包转化为01背包的关键在于把件数从整体中孤立出来作为一个新的个体,也就是说不管分类,有多少件就有多少种. AC代码: //============================================================================ // Na

解题报告:hdu2191汶川地震 - 多重背包模板

2017-09-03 17:01:36 writer:pprp 这是一道多重背包裸题 - 记得是从右向左进行,还有几点需要注意啊,都在代码中表示出来了 代码如下: /* @theme:hdu2191 汶川地震 @writer:pprp @begin:16:25 @end:16:59 @declare:多重背包问题 @error:方向是从左向右进行 @date:2017/9/3 */ #include <bits/stdc++.h> using namespace std; int M, N;/

HDU2191悼念512汶川大地震遇难同胞——珍惜现在,感恩生活[多重背包]

悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 25602    Accepted Submission(s): 10836 Problem Description 急!灾区的食物依然短缺!为了挽救灾区同胞的生命,心系灾区同胞的你准备自己采购一些粮食支援灾区,现在假设你一共有资金n元,而

悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 hdu2191(01背包)

http://acm.hdu.edu.cn/showproblem.php?pid=2191 中文题目,就不说废话了... 分析:这道题是多重背包,但是可以用01背包来做,把每种大米有几袋一个一个单独存储,这样就变成01背包了... #include <iostream> #include <stdio.h> #include <string.h> #include <string> #include <vector> #include <

hdu2191(多重背包)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2191 分析: ======================================== 多重背包问题定义 & 基本实现 问题:有个容量为V大小的背包,有很多不同重量weight[i](i=1..n)不同价值value[i](i=1..n)的货物,第i种物品最多有n[i]件可用,计算一下最多能放多少价值的货物. 对于多重背包的基本实现,与完全背包是基本一样的,不同就在于物品的个数上界不再是v/

多重背包 HDU2191

1 #include <iostream> 2 #include <cstring> 3 4 using namespace std; 5 6 int v[2010]; 7 int w[2010]; 8 long long int dp[400010]; 9 10 int main() 11 { 12 int T; 13 cin>>T; 14 while(T--) 15 { 16 int n,m; 17 cin>>n>>m; 18 int p,h

多重背包--java

多重背包 有N种物品和一个容量为V的背包.第i种物品最多有n[i]件可用,每件费用是c[i],价值 是w[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大母函数的思想也是如此 给你 价值, 物品数量的限制, 然后凑, hdu2191 import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in);

HDU 2189 悼念512汶川大地震遇难同胞——来生一起走(母函数或完全背包)

悼念512汶川大地震遇难同胞--来生一起走 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3773    Accepted Submission(s): 1913 Problem Description 妈妈你别哭泪光照亮不了我们的路让我们自己慢慢的走 妈妈我会记住你和爸爸的模样记住我们的约定来生一起走 上面这首诗节选自一位诗人纪念遇难