负值01背包

2人阅读 评论(0) 收藏 举报
分类:

题意:n头牛,每头牛有一个幽默值和聪明值(有负数),问如何从中选择k头牛,使得幽默值和聪明值的和非负且最大。

思路:把问题看成01背包,背包的总容量为幽默值的和,每一头牛的幽默值和聪明值分别看成是物品的价值和体积。因为幽默值有可能为负数,不能做数组的下标,所以要先移位。

#include<cstdio>
#include<iostream>
#include<algorithm> 
#include<cstring>
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=2e5+50;
const int shift=1000;
int n,f[maxn],s[maxn],dp[maxn],c,cnt[maxn],ans;
int main(){
	while(scanf("%d",&n)!=EOF){
		memset(f,0,sizeof(f));
		memset(s,0,sizeof(s));
		memset(dp,-inf,sizeof(dp));
		memset(cnt,0,sizeof(cnt));
		dp[0]=0;///除了 背包空间为0的时候最大价值为0外其他背包设置为理论上最小:-inf 
		c=0;
		for(int i=0;i<n;i++){
			scanf("%d%d",&f[i],&s[i]);
			if(s[i]<0&&f[i]<0){///两者都为负数,不取比取好 
				i--,n--;
				continue;
			}
			s[i]+=shift;///移动避免负值 
			c+=s[i];///求背包总容量 
		}
		ans=-inf;
		for(int i=0;i<n;i++)
		for(int j=c;j>=s[i];j--){
			if(dp[j]-cnt[j]*shift<=dp[j-s[i]]+f[i]-(cnt[j-s[i]]+1)*shift){///这里进行了移动预处理,所以要移回去 
				dp[j]=dp[j-s[i]]+f[i];
				cnt[j]=cnt[j-s[i]]+1;
			}
		}
		for(int i=0;i<=c;i++){
			if(i-shift*cnt[i]>=0&&dp[i]>=0){
				ans=max(ans,i-shift*cnt[i]+dp[i]);
			}
		}
		printf("%d\n",ans);
	}
	return 0;
} 

查看评论

POJ2184------带负值的01背包

题目地址:http://poj.org/problem?id=2184 题目意思: 给你N个S,F 从中选择后,要使S+F的和最大,且S和F的和都不能为负 解题思路: 转化为当S去i时得到的...
  • dr5459
  • dr5459
  • 2013-07-01 23:14:14
  • 715

密码锁 01背包

  • 2017年11月09日 21:38
  • 45KB
  • 下载

01背包的代码

  • 2014年08月19日 11:31
  • 773B
  • 下载

回溯01背包

  • 2013年12月16日 14:02
  • 24KB
  • 下载

NYOJ 题目860 又见01背包 (特别版01背包)

又见01背包 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述     有n个重量和价值分别为wi 和 vi 的 物品,从这些物品中选择总重量不...
  • L_BestCoder
  • L_BestCoder
  • 2016-03-06 20:37:09
  • 965

01背包的几种解法(未完待续)

01背包问题,背包容量为capacity,n种物品,物品重量数组w[],物品价值数组v[],求在该背包容量内可以装的所有物品价值的最大值? 简单说几种方法, 第一个是暴力,遍历所有物品的所有组合,...
  • taiyanggongsi
  • taiyanggongsi
  • 2015-06-18 15:12:31
  • 487

01背包大全(涵盖所有方法实现)

  • 2014年05月14日 12:48
  • 1.86MB
  • 下载

01背包状态压缩和记录路径

01背包的状态压缩   当然肯定是看了别人的博客,我再重复一下,大神链接:点击打开链接 1、        在看之前希望你已经弄懂了空间复杂度在O(n*w)的算法,空间的压缩到O(w)的状态,其...
  • Cai_Nia
  • Cai_Nia
  • 2016-12-14 22:55:44
  • 1292

从01背包学习贪心算法和动态规划

从01背包学习贪心算法和动态规划: 算法的思路其实很大程度上都是相通的,比如在提升算法运行时间的不断探索中,我们用分治的思想来将一个大问题分解为很多小问题进行求解,并且这些子问题与原问题的结构是一样...
  • u014449866
  • u014449866
  • 2015-05-01 21:31:36
  • 2353

01背包 一维数组写的01背包

#include #include int main() {     int n,i,j,w[10],p[10],m,f[100];     while(scanf("%d%d",&n,&m...
  • u013491149
  • u013491149
  • 2014-04-29 10:15:34
  • 840
    个人资料
    持之以恒
    等级:
    访问量: 1万+
    积分: 1764
    排名: 2万+
    最新评论