hdu1494&&hdu1203&&hdu2602(背包和dp)

hdu2602

简单01背包

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define maxn(x,y) x>y?x:y
using namespace std;
int a[1100],v[1100],res[1100];
int main()
{
	int i,t,n,V;
#ifndef ONLINE_JUDGE
	freopen("D:\\o.txt","r",stdin);
#endif // ONLINE_JUDGE
	scanf("%d",&t);
	while(t--)
	{
		memset(res,0,sizeof(res));
		cin>>n>>V;
		for(i=1;i<=n;i++)cin>>a[i];
		for(i=1;i<=n;i++)cin>>v[i];
		for(i=1;i<=n;i++)
		{
			for(int j=V;j>=v[i];j--)
			{
				res[j]=maxn(res[j],res[j-v[i]]+a[i]);//状态转移方程
			}
		}
		printf("%d\n",res[V]);
	}
	return 0;
}


hdu1203

//与上一题差不多,注意到至少有一个的话,我们可以反过来考虑,就是最小的全部没有的概率,然后1减去算得的概率就是最后结果了

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define inf 1<<30
#define maxn(x,y) x>y?x:y
#define minn(x,y) x>y?y:x
using namespace std;
int v[11000];
double a[11000],res[11000];
int main()
{
	int i,n,V;
#ifndef ONLINE_JUDGE
	freopen("D:\\o.txt","r",stdin);
#endif // ONLINE_JUDGE
	while(cin>>V>>n&&n+V)
	{
		for(i=0;i<=V;i++)res[i]=1;
		for(i=1;i<=n;i++)cin>>v[i]>>a[i];
		for(i=1;i<=n;i++)
		{
			for(int j=V;j>=v[i];j--)
			{
				res[j]=minn(res[j],res[j-v[i]]*(1-a[i]));
			}
		}
		printf("%0.1f%%\n",(1-res[V])*100);
	}
	return 0;
}


hdu1494

//这个题目自己没有做出来,相当委屈!!!

//首先用dp[i][j]表示第i段能量为j时所走的最短时间,接下来就分为四种情况考虑

//当j==0时,只能是能量为5的上一个阶段变为本阶段

//当j<10时,取上一个阶段能量为j-1的和上一个阶段能量为j+5的较小的一个

//当j>10时,只能是上一个阶段能量为j-1变为本阶段

//当j==10时,取上一个阶段能量为j-1的和上一个能量为14的较小的一个

//注意初始化问题,当i==0时,j=1,2,3,4…………14都要为inf因为没有这种状态

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define inf 1<<30
#define M 100010
#define maxn(x,y) x>y?x:y
#define minn(x,y) x>y?y:x
using namespace std;
int a[M],b[M],dp[M][15];
int main()
{
	int i,j,L,n;
#ifndef ONLINE_JUDGE
	freopen("D:\\o.txt","r",stdin);
#endif // ONLINE_JUDGE
	while(cin>>L>>n)
	{		
		for(i=1;i<=L;i++)cin>>a[i];
		for(i=1;i<=L;i++)cin>>b[i];
		for(i=1;i<=L;i++)
		{
			for(j=i+L;j<=n*L;j+=L)
				a[j]=a[i],b[j]=b[i];
		}
		for(i=0;i<=n*L;i++)for(j=0;j<15;j++)dp[i][j]=inf;
		dp[0][0]=0;
		for(i=1;i<=n*L;i++)
		{			
			for(j=0;j<15;j++)
			{
				if(j==0)
					dp[i][j]=dp[i-1][j+5]+b[i];
				else if(j<10)
					dp[i][j]=minn(dp[i-1][j+5]+b[i],dp[i-1][j-1]+a[i]);
				else if(j>10)
					dp[i][j]=dp[i-1][j-1]+a[i];
				else if(j==10)
					dp[i][j]=minn(dp[i-1][14]+a[i],dp[i-1][j-1]+a[i]);
			}
		}
		int res=inf;
		for(j=0;j<15;j++)
			res=minn(dp[n*L][j],res);
		printf("%d\n",res);
	}
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值