poj 3624 Charm Bracelet

纪念一下理解第一道dp了。。

#include<stdio.h>
#include<string.h>
int v[3500];
int w[3500];
int dp[35000];
int max(int g,int h)
{
    return g<h?h:g;
}
int main()
{
    int n,W;
    scanf("%d%d",&n,&W);
    int i;
    for(i=1;i<=n;i++)
    {
        scanf("%d%d",&w[i],&v[i]);
    }
    memset(dp,0,sizeof(0));
    /*for(i=1;i<=W;i++) { for(int j=1;j<=n;j++) if(i>=w[j]) dp[i]=max(dp[i],dp[i-w[j]]+v[j]); }*///这是我首先想到的做法,但是它无法标记东西是否放入,所以,就有了下面的方式,东西就不会重复放入了。。
    for(i=1;i<=n;i++)
    {
        for(int j=W;j>=w[i];j--)//j为何从大到小呢?也是为了防止东西重复放入啦。。
        {
            dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
        }
    }
    printf("%d\n",dp[W]);
    return 0;
}

你可能感兴趣的:(dp,poj)