蒟蒻表示AC了却不知道为什么

P1417 烹调方案

sak_ma @ 2018-10-24 15:34:47

emmm......本蒟蒻用了最朴素的方法,然后问题在于:

include<iostream>

include<algorithm>

using namespace std;

int t,n;

struct yan {

int a;
int b;
int c;

} u[55];

long long dp[100005];

bool cmp(const yan &x, const yan &y) { return x.by.c>y.bx.c; }

int main() {

cin>>t>>n;
for(int i=1; i<=n; i++)
    cin>>u[i].a;
for(int i=1; i<=n; i++)
    cin>>u[i].b;
for(int i=1; i<=n; i++)
    cin>>u[i].c;
sort(u+1,u+n+1,cmp);
for(int i=1; i<=n; i++) 
    for(int j=t; j>=u[i].c; j--)
        dp[j]=max(dp[j],dp[j-u[i].c]+u[i].a-(long long)j*u[i].b);
long long M=-1;
for(int i=1;i<=t;i++)
M=max(M,dp[i]);
cout<<M;
return 0;

} 本蒟明白为什么最后要遍历一遍求最大的,却不明白这里:

    for(int j=t; j>=u[i].c; j--)
        dp[j]=max(dp[j],dp[j-u[i].c]+u[i].a-(long long)j*u[i].b);

为什么dp[j]=max(dp[j],......)而不是dp[j]=max(dp[1...j]......)。 求大佬赐教


by zzsqwq @ 2018-10-24 15:39:52

对 dp[j]当前这个状态进行更新

有选这个物品和不选这个物品

不选就是原来状态不变dp[j]

选了就是后方那个

qwq可能是错的因为我也很弱


by King_of_gamers @ 2018-10-24 15:49:47

希望更丰富的展现?使用Markdown


by Everlasting_Snow @ 2018-10-24 15:50:09

希望更丰富的展现?使用Markdown


by hellomath @ 2018-10-24 15:50:39

希望更丰富的展现?使用Markdown


by Juanzhang @ 2018-10-24 15:57:21

@larryzhong %%%


by hellomath @ 2018-10-24 16:24:27

@小光 %%%


by sak_ma @ 2018-10-24 18:48:58

@zzsqwq 问题在于dp[i]j表示到第i个食物为止,恰在第j秒完成对第i个食物的烹饪的最大价值而非前j秒的最大价值。


by Mevinsp @ 2019-01-22 19:22:39

希望更丰富的展现?使用Markdown


by Double_Y @ 2019-07-25 11:04:11

希望更丰富的展现?使用Markdown


|