欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ACM DP Lighting System Design&&Jin Ge Jin Qu hao

程序员文章站 2022-03-12 21:52:26
...

滴,集训第十五天打卡。

哎呀..回家了一趟落下了一大截啊...容我慢慢补起来~~

训练也到了第九章,dp。


uva 11400 Lighting System Design

ACM DP Lighting System Design&&Jin Ge Jin Qu hao

题目大意:设计一个照明系统,有N种灯泡可以选择,不同种类的灯必须用不同的电源,但同一种灯泡可以共用一个电源。每种灯泡有电压V,电源费用K,每个灯泡的费用C和所需灯泡数量L。为了省钱,可以把一些灯泡换成电压更高的另一种灯泡来节省电源的钱。

思路:每种电压的灯泡,要么全换,要么全不换。先把灯泡按电压从小到大排序,那么前面的都能换后面的。设s[i]为前i种灯泡的总数量,dp[i]为灯泡1-i的最小开销,则dp[i]=min(dp[i],dp[j]+(s[i]-s[j])*f[i].c+f[i].k)。

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
struct sb
{
	int v,k,c,l;
}f[1005];
bool cmp(sb u,sb w)
{
	return u.v<w.v;
}
int main()
{
	int n,i,j,dp[1005],s[1005],ss;
	while(scanf("%d",&n))
	{
		if(n==0)break;
		for(i=1;i<=n;i++)
		scanf("%d %d %d %d",&f[i].v,&f[i].k,&f[i].c,&f[i].l);
		sort(f+1,f+n+1,cmp);
		ss=0;
	 	memset(dp,0x7f7f7f7f,sizeof(dp)); 
	 	dp[0]=0;s[0]=0;
		for(i=1;i<=n;i++)
		{
			ss+=f[i].l;
			s[i]=ss;
			for(j=0;j<i;j++)
			{
				dp[i]=min(dp[i],dp[j]+(s[i]-s[j])*f[i].c+f[i].k);
				//printf("%d**\n",dp[j]+(s[i]-s[j])*f[i].c+f[i].k);
			}
		}
		printf("%d\n",dp[n]);
	}
}

UVA 12563 Jin Ge Jin Qu hao

ACM DP Lighting System Design&&Jin Ge Jin Qu hao

ACM DP Lighting System Design&&Jin Ge Jin Qu hao

题目大意:在KTV唱歌,剩下t秒时间,可以唱n首歌曲中的一些。使得唱的总曲目尽量多。(留下1s唱劲歌金曲)

思路:01背包问题。分别设置歌曲数目和时长两个数组。因为最多50首歌,每首歌最长180s,所以数组设置10000足够了。

#include <stdio.h>
#include <string.h>
int num[10001],times[10001];
int main()
{
	int t,n,m,i,j,o=1,s,a[105];
	scanf("%d",&t);
	while(t--)
	{
		s=0;
		scanf("%d%d",&n,&m);
		for(i=1;i<=n;i++)
		{
			scanf("%d",&a[i]);
			s+=a[i];
		}
		printf("Case %d: ",o++);
		if(s<m)
		printf("%d %d\n",n+1,s+678);
		else
		{
			memset(num,0,sizeof(num));
			memset(times,0,sizeof(times));
			for(i=1;i<=n;i++)
			{
				for(j=m-1;j>=a[i];j--)
				{
					if(num[j]==num[j-a[i]]+1)
					{
						if(times[j]<times[j-a[i]]+a[i])
						times[j]=times[j-a[i]]+a[i];
					}
					else if(num[j]<num[j-a[i]]+1)
					{
						num[j]=num[j-a[i]]+1;
						times[j]=times[j-a[i]]+a[i];
					}
				}
			}
			printf("%d %d\n",num[m-1]+1,times[m-1]+678);
		}
	}
}


相关标签: DP