vijos P1836HYS与七夕节大作战 (01背包之2--转换dp对象)

题目:vijos P1836HYS与七夕节大作战

题意:

n个对象,每价值为vi,比重pi,总容量100

分析:

类似背包重量的比重pi为实数,不能作为下标,所以改变dp对象

将求容量100内的最大价值 → 求相应价值的最小容量,

则容量第一个≤100的价值,为符合条件的价值最大的值

状态:dp[v]:价值为v的最小容积

转移方程:

        dp[V] = min(dp[V], dp[V-v[i]] + p[i]);

核心:

for(i = 1; i<=n; i++)
{
    for(j = sum_V; j>=v[i]; j--)
    {
        dp[j] = min(dp[j], dp[j-v[i]] + p[i]);
    }
}

代码:

#include <stdio.h>
#include <iostream>
#include <math.h>
#include <algorithm>
#include <string.h>
#include <string>
#include <queue>
#include <stack>
#include <map>
#include <vector>
#include <time.h>

using namespace std;

double p[1000+10];
int v[1000+10];
double dp[5*1000+10];

int main()
{
	//freopen("a.txt", "r", stdin);

	int n, i, j;
	while(~scanf("%d", &n))
	{
		int sum = 0;
		for(i = 1; i<=n; i++)
		{
			scanf("%lf%d", &p[i], &v[i]);
			sum += v[i];
		}
		memset(dp, 0x4f, sizeof(dp));
		dp[0] = 0;
		for(i = 1; i<=n; i++)
		{
			for(j = sum; j>=v[i]; j--)
			{
				dp[j] = min(dp[j], dp[j-v[i]] + p[i]);
			}
		}
		while(dp[sum]>100)sum--;
		printf("%d\n", sum);
	}
	return 0;
}

vijos P1836HYS与七夕节大作战 (01背包之2--转换dp对象),布布扣,bubuko.com

时间: 2024-08-01 08:57:18

vijos P1836HYS与七夕节大作战 (01背包之2--转换dp对象)的相关文章

球球大作战 01 小球的移动和碰到金币,金币会消失。

版权申明: 本文原创首发于以下网站: 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123 优梦创客的官方博客:https://91make.top 优梦创客的游戏讲堂:https://91make.ke.qq.com 『优梦创客』的微信公众号:umaketop 您可以自由转载,但必须加入完整的版权声明! 球球大作战小球的移动和碰到金币,金币会消失. 吃到金币 public class SphereMove : MonoBehaviour { p

DP大作战——多重背包

题目描述 在之前的上机中,零崎已经出过了01背包和完全背包,也介绍了使用-1初始化容量限定背包必须装满这种小技巧,接下来的背包问题相对有些难度,可以说是01背包和完全背包的进阶问题. 多重背包:物品可以有0-n件. 对于第i种物品,我们有取0件,1件…n [ i ] 件共n [ i ] +1种策略,状态转移方程为f [ i ] [ v ] = max { f [ i - 1 ] [ v - k × c [ i ] ] + k × w [ i ] | 0 <=k<= n [ i ] }.在这里,

hdu 1203 I NEED A OFFER (0-1背包)

题意分析:0-1背包变形  递推公式:dp[i] = max(dp[i], 1-(1-dp[i-C])*(1-p)) /* I NEED A OFFER! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 17860 Accepted Submission(s): 7152 Problem Description Speakless很早就想出国

01背包 两维背包

#include <iostream> #include <algorithm> using namespace std; /******************************** 01背包 */ #define N 5 #define M 12 int value[N + 1] = { 0, 6, 3, 5, 4, 6 }; int weight[N + 1] = { 0, 2, 2, 6, 5, 4 }; //#define N 5 //#define M 8 //i

HDU 5887 Herbs Gathering(搜索求01背包)

http://acm.hdu.edu.cn/showproblem.php?pid=5887 题意: 容量很大的01背包. 思路: 因为这道题目背包容量比较大,所以用dp是行不通的.所以得用搜索来做,但是需要一些剪枝,先按体积排序,优先考虑体积大的物品,这样剪枝会剪得多一些(当然按照性价比排序也是可以的). 1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<cstdi

01背包//简直要被这道题玩死(掀桌)

先上链接: 表格什么的最清楚了:http://blog.csdn.net/mu399/article/details/7722810 dd大大的背包九讲: —————————————————— 01背包的状态转换方程 f[i,j] = Max{ f[i-1,j-Wi]+Pi( j >= Wi ),  f[i-1,j] } f[i,j]表示在前i件物品中选择若干件放在承重为 j 的背包中,可以取得的最大价值. Pi表示第i件物品的价值. 决策:为了背包中物品总价值最大化,第 i件物品应该放入背包中

【背包专题】F - Ahui Writes Word hdu3732【01背包+二进制优化】

We all know that English is very important, so Ahui strive for this in order to learn more English words. To know that word has its value and complexity of writing (the length of each word does not exceed 10 by only lowercase letters), Ahui wrote the

背包之01背包、完全背包、多重背包详解

首先说下动态规划,动态规划这东西就和递归一样,只能找局部关系,若想全部列出来,是很难的,比如汉诺塔.你可以说先把除最后一层的其他所有层都移动到2,再把最后一层移动到3,最后再把其余的从2移动到3,这是一个直观的关系,但是想列举出来是很难的,也许当层数n=3时还可以模拟下,再大一些就不可能了,所以,诸如递归,动态规划之类的,不能细想,只能找局部关系. 1.汉诺塔图片 (引至杭电课件:DP最关键的就是状态,在DP时用到的数组时,也就是存储的每个状态的最优值,也就是记忆化搜索) 要了解背包,首先得清楚

hdu 3339 In Action (最短路径+01背包)

In Action Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3869    Accepted Submission(s): 1237 Problem Description Since 1945, when the first nuclear bomb was exploded by the Manhattan Project t