码迷,mamicode.com
首页 > 移动开发 > 详细

ZOJ 3703 Happy Programming Contest

时间:2014-11-17 10:45:52      阅读:230      评论:0      收藏:0      [点我收藏+]

标签:blog   http   io   ar   os   sp   for   strong   on   

题目链接~~>

做题感悟:这题比赛时想了好久才做出来,赛后一想其实就是 01 背包一下,记录各个体积的最优值就可以了,比赛时想多了。

解题思路:

               我直接开的二维数组 dp[ i ] [ j ]  代表达到体积 i ,做了 j 道题所达到的最优状态 : dp[ i ] [ j ]  = { dp [ i - v ] [ j - 1 ] } 的最优值 ,其实就是二维的背包 。

代码:

#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<algorithm>
using namespace std ;
#define INT long long int
const int INF = 0x3f3f3f3f ;
const int MX = 1000 + 10 ;
int C ,n ;
int dp[2][MX][55] ;
struct node
{
    int v ,w ;
}T[MX] ;
bool cmp(node a, node b)
{
    if(a.v == b.v)  return a.w > b.w ;
    else
            return a.v < b.v ;
}
void input()
{
    scanf("%d%d" ,&C ,&n) ;
    for(int i = 0 ;i < n ; ++i)
        scanf("%d" ,&T[i].v) ;
    for(int i = 0 ;i < n ; ++i)
        scanf("%d" ,&T[i].w) ;
}
int main()
{
    //freopen("input.txt" ,"r" ,stdin) ;
    int Tx ;
    scanf("%d" ,&Tx) ;
    while(Tx--)
    {
        input() ;
        int ans = 0 ,num = 0 ,Wx = INF ;
        sort(T ,T+n ,cmp) ;
        memset(dp[0] ,-1  ,sizeof(dp[0])) ;
        memset(dp[1] ,0 ,sizeof(dp[1])) ;
        dp[0][0][0] = 0 ;
        for(int t = 1 ;t <= n ; ++t)
         for(int j = C  ;j >= T[t-1].v ; --j)
           for(int i = t ;i >= 1 ; --i)
            if(dp[0][j-T[t-1].v][i-1] != -1)
            {
                 int v = T[t-1].v ;
                 int w = T[t-1].w ;
                 if(dp[0][j][i] < dp[0][j-v][i-1] + w)
                 {
                    dp[0][j][i] = dp[0][j-v][i-1] + w ;
                    dp[1][j][i] = dp[1][j-v][i-1] + j ;
                 }
                 else if(dp[0][j][i] == dp[0][j-v][i-1] + w && dp[1][j][i] > dp[1][j-v][i-1] + j)
                 {
                     dp[0][j][i] = dp[0][j-v][i-1] + w ;
                     dp[1][j][i] = dp[1][j-v][i-1] + j ;
                 }
                 if(dp[0][j][i] > ans || (dp[0][j][i] == ans && i > num) || (dp[0][j][i] == ans && i == num && Wx > dp[1][j][i]))
                 {
                     ans = dp[0][j][i] ;
                     num = i ;
                     Wx = dp[1][j][i] ;
                 }
            }
         if(Wx != INF)
                 cout<<ans<<" "<<num<<" "<<Wx<<endl ;
         else    cout<<"0 0 0"<<endl ;
    }
    return 0 ;
}



ZOJ 3703 Happy Programming Contest

标签:blog   http   io   ar   os   sp   for   strong   on   

原文地址:http://blog.csdn.net/nyist_zxp/article/details/41204881

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!