#include#include#include#include#include" />

亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

1570. Eating High

系統 1873 0

http://acm.timus.ru/problem.aspx?space=1&num=1570

此題如果只求最少花費的話,就可以簡單的dp或是背包就可以了

難就難在在選擇路徑上有困難? 應該在記錄路徑時 記下所有可能是最優的路徑 排除一定不是最優的路徑

然后選擇一條最優的總路徑

代碼:

      #include<iostream>

#include<cstdio>

#include<cstring>

#include<cmath>

#include<algorithm>

#include<vector>

#include<set>

#include<map>

#include<string>

#include<queue>

#include<stack>

#include <iomanip>

using namespace std;

#define LL long long

const double eps=1e-6;

const int INF=0x3f3f3f3f;

const int N=40005;

const int M=105;

struct node

{

    string name;

    int cost;

    int weight;

}mem[M];

int dp[N],num[N],f[N];

vector<int>vtf[N],vtnum[N];

int sum[M];

int n,m;

bool cmp(node x,node y)

{

    return x.cost<y.cost;

}

void packComplete(int k,int cost,int weight,int V)

{

    for(int v=cost;v<=V;++v)

    {

        if(v-cost>=m)

        break;

        if(dp[v-cost]+weight>dp[v])

        continue;

        if(dp[v-cost]+weight<dp[v])

        {

            vtf[v].clear();vtnum[v].clear();

            dp[v]=dp[v-cost]+weight;

            num[v]=num[v-cost]+((f[v-cost]==k)?0:1);

            vtf[v].push_back(k);vtnum[v].push_back(num[v]);

            f[v]=k;

        }else if(num[v-cost]+((f[v-cost]==k)?0:1)>num[v])

        {

            num[v]=num[v-cost]+((f[v-cost]==k)?0:1);

            vtf[v].push_back(k);vtnum[v].push_back(num[v]);

            f[v]=k;

        }

    }

}

int main()

{

    //freopen("data.in","r",stdin);

    while(cin>>n>>m)

    {

        m=int(m*1000+eps);

        int V=N-5;

        for(int i=1;i<=n;++i)

        {

            double ftmp;

            cin>>mem[i].name>>mem[i].weight>>ftmp;

            mem[i].cost=int(ftmp*1000+eps);

        }

        sort(mem+1,mem+n+1,cmp);

        memset(f,0,sizeof(f));

        memset(num,0,sizeof(num));

        for(int i=1;i<=V;++i)

        dp[i]=INF;

        dp[0]=0;

        for(int i=1;i<=n;++i)

        packComplete(i,mem[i].cost,mem[i].weight,V);

        memset(sum,0,sizeof(sum));

        int k=V;

        for(int i=m;i<V;++i)

        if(dp[i]<dp[k]||(dp[i]==dp[k]&&num[i]>num[k]))

        k=i;

        cout<<dp[k]<<endl;

        int pnum=num[k],pk=-1;

        while(k!=0)

        {

            for(unsigned int i=0;i<vtf[k].size();++i)

            {

                if(vtnum[k][i]+((vtf[k][i]==pk||pk==-1)?0:1)==pnum)

                {

                    pnum=vtnum[k][i];

                    pk=vtf[k][i];

                    ++sum[pk];

                    k=k-mem[pk].cost;

                    break;

                }

            }

        }

        for(int i=1;i<=n;++i)

        if(sum[i]!=0)

        cout<<mem[i].name<<" "<<sum[i]<<endl;

    }

    return 0;

}


    

?

1570. Eating High


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: sihu永久在线播放地址 | 大学生一一级毛片在线播放 | 亚洲天堂资源 | 精品新一区二区三区四区 | 天天做夜夜做久久做狠狠 | 综合一区| 精品视频 久久久 | 国产91福利在线精品剧情尤物 | 黄色影院7755 | 国内精品一区视频在线播放 | 亚洲国产高清在线精品一区 | 午夜精品久久久久久久第一页 | 国产视频在线观看福利 | 在线精品欧美 | 日本亚洲欧洲免费无码 | 老子影院午夜伦不卡亚洲 | 国产精品九九久久一区hh | 亚洲一区精品中文字幕 | 鲁一鲁射一射 | 97在线观看免费视频 | 欧美乱一级在线观看 | 久久久在线视频精品免费观看 | 欧美日韩一区二区三区自拍 | 777kkk亚洲综合欧美色老头 | 亚洲免费视频在线 | 亚洲欧洲日韩国产一区二区三区 | 宅男在线影院 | 三及毛片 | 欧美国产亚洲18 | 亚洲精品一区二区三区婷婷月 | 97人人看| 九九视频免费观看 | 国内精品视频成人一区二区 | 2021国产精品久久久久 | 精品91自产拍在线观看99re | 2021中文字幕亚洲精品 | 亚洲图片综合 | 国产福利资源 | 中文字幕 亚洲精品 | 亚欧成人毛片一区二区三区四区 | 五月婷婷激情 |