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;
}