POJ1155 TELE(树形DP)

题目大意:

一个电视台转播比赛,电视网络类似于树,树的节点为中转站或者用户

节点的编号为1~N,其中1为总站,2到(N-M)为中转站,(N-M+1)到N为用户

节点到节点间转移信号需要给定的费用,且每个用户愿意出给定的钱付费

在电视台不亏本的前提下,求最多可以让多少用户看到比赛


树形背包DP,容量为该点的子节点数量,价值为费用

状态 dp[u][j] 代表根节点为u含有j个子节点的子树所获得的费用(负为亏)

状态转移 dp[u][j]=max(dp[u][j],dp[u][j-k]+dp[v][k]-edge[i].w)


#include <stdio.h>
#include <string.h>
#define MAXN 3010

struct Node{
	int v,w,next;
}edge[MAXN*MAXN];

int dp[MAXN][MAXN];
int num[MAXN];	//容量
int head[MAXN];

int max(int a,int b)
{
	return a>b?a:b;
}

void dfs(int u)
{
	int i,j,k,v;
	for(i=head[u];i!=-1;i=edge[i].next)
	{
		v=edge[i].v;
		dfs(v);
		num[u]+=num[v];
		for(j=num[u];j>=1;j--)	//背包 需要逆向
			for(k=1;k<=num[v];k++)
				dp[u][j]=max(dp[u][j],dp[u][j-k]+dp[v][k]-edge[i].w);
	}
}

int main()
{
	int i,j,n,m,k,cnt=0;
	memset(head,-1,sizeof(head));
	scanf("%d%d",&n,&m);
	for(i=1;i<=n-m;i++)
	{
		scanf("%d",&k);
		while(k--)
		{
			scanf("%d%d",&edge[cnt].v,&edge[cnt].w);
			edge[cnt].next=head[i];
			head[i]=cnt++;
		}
	}
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
            dp[i][j]=-1e9;//因为状态有负值 所以不能为0
	for(i=n-m+1;i<=n;i++)
	{
		num[i]=1;
		scanf("%d",&dp[i][1]);
	}
	dfs(1);
	for(i=num[1];i>=0;i--)
		if(dp[1][i]>=0)
			break;
	printf("%d",i);
	return 0;
}


1、资源项目源码均已通过严格测试验证,保证能够正常运行;、 2项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行;、 2项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值