Hdu 2955 - Robberies

1380 단어
0-1 가방 문제
 
 
상태 전환 방정식:
dp[j]=max(dp[j],dp[j-m[i]]*(1-q[i]))

그 중에서 dp[j]는 j개의 대양을 빼앗은 후의 최대 탈출 확률을 나타낸다. 조건은 dp[j-m[i]가 도착할 수 있다는 것이다. 즉, 이전에 약탈한 적이 있다는 것이다.
초기화 dp[0]=1, 나머지는 0 또는 -1!
AC 코드:
#include <stdio.h>
#include <string.h>
double max(double a,double b)
{
    if(a>b) 
        return a;
    else
        return b;
}
double q[1000];
double dp[100000];
int m[1000];
int main()
{
    int T,i,j,sum,N;
    double P;
    scanf("%d",&T);
    while (T--)
    {
    
        
            sum=0;
            //double P;
            scanf("%lf %d",&P,&N);
            for(i=0;i<N;i++)
            {
                scanf("%d %lf",&m[i],&q[i]);
                sum+=m[i];
            }
        
        memset(dp,0,sizeof(dp));
        dp[0]=1.0;
        for(i=0;i<N;i++)
            for(j=sum;j>=m[i];j--)
            {
                dp[j]=max(dp[j],dp[j-m[i]]*(1-q[i]));
            }
            for(j=sum;j>=0;j--)
            {
                if(dp[j]>=(1-P))
                {
                    printf("%d
",j); break; } } } return 0; }

좋은 웹페이지 즐겨찾기