HDU 2602

来源:互联网 发布:如何在淘宝头条发文章 编辑:程序博客网 时间:2024/04/30 00:38

DP,基础简单背包问题。。。然后转移方程没错不知道wa在哪里。。。今晚吃齁了不想查。。。。。

*******************************************

用二维的今天早上仍旧不知道wa在哪里。改成一维的一下就跑过了。不懂为什么。然后就是其实每个数组都记录的是最优的状态。好像二维和一维的循环不大一样。再研究研究。

对的:

#include <stdio.h>#include <iostream>#include <cstring>using namespace std;#define maxn 1010int dp[maxn],val[maxn],cost[maxn];int main(){    int t;    scanf("%d",&t);    while(t--)    {        memset(dp,0,sizeof(dp));        int n,m,ans=0;        scanf("%d%d",&n,&m);        int i,j,k;        for(i=1;i<=n;i++) scanf("%d",&val[i]);        for(i=1;i<=n;i++) scanf("%d",&cost[i]);        for(i=1;i<=n;i++)            for(j=m;j>=cost[i];j--)        {            dp[j]=max(dp[j],dp[j-cost[i]]+val[i]);        }        //for(i=0;i<=m;i++) ans=max(ans,dp[i]);        printf("%d\n",dp[m]);    }    return 0;}

错的:

#include <stdio.h>#include <string.h>#define maxn 1010#define ll __int64ll dp[maxn][maxn],val[maxn],cost[maxn];ll max(ll x,ll y){    if(x>y) return x;    else return y;}int main(){    int t;    scanf("%d",&t);    while(t--)    {        ll n,m;        ll ans=-1;        memset(dp,0,sizeof(dp));        memset(cost,0,sizeof(cost));        memset(val,0,sizeof(val));        scanf("%I64d%I64d",&n,&m);        int i,j,k;        for(i=1;i<=n;i++) scanf("%I64d",&val[i]);        for(i=1;i<=n;i++) scanf("%I64d",&cost[i]);        for(i=1;i<=n;i++)            for(j=m;j>=cost[i];j--)                {                    dp[i][j]=max(dp[i][j],dp[i-1][j-cost[i]]+val[i]);                    if(i==n) ans=max(ans,dp[i][j]);                }        printf("%I64d\n",ans);    }    return 0;}


0 0
原创粉丝点击