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

来源:互联网 发布:网络如何交友 编辑:程序博客网 时间:2024/06/05 11:31

hdu2602

简单01背包

#include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>#include<algorithm>#define maxn(x,y) x>y?x:yusing namespace std;int a[1100],v[1100],res[1100];int main(){int i,t,n,V;#ifndef ONLINE_JUDGEfreopen("D:\\o.txt","r",stdin);#endif // ONLINE_JUDGEscanf("%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:xusing namespace std;int v[11000];double a[11000],res[11000];int main(){int i,n,V;#ifndef ONLINE_JUDGEfreopen("D:\\o.txt","r",stdin);#endif // ONLINE_JUDGEwhile(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:xusing namespace std;int a[M],b[M],dp[M][15];int main(){int i,j,L,n;#ifndef ONLINE_JUDGEfreopen("D:\\o.txt","r",stdin);#endif // ONLINE_JUDGEwhile(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;}