NYOJ289 苹果

原先用的滚动数组,现在用基本的动态规划,结果调试了很多次,发现了原因,贴上改正后的代码:

 1 #include <stdio.h>

 2 #include <string.h>

 3 int v[1005],c[1005];

 4 int f[1005][1005];

 5 int max(int a,int b){

 6     if(a>b) return a;

 7     return b;

 8 }

 9 int main()

10 {

11     int i,j,n,C;

12     while(scanf("%d%d",&n,&C),n||C){

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

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

15             scanf("%d%d",&c[i],&v[i]);

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

17             for(j=0;j<=C;j++){   //也可以改为j从C到0

18                 f[i][j]=f[i-1][j];  //忘记了当 j<c[i]时,需

19                         //要把当前f[i-1][j]的值传递过去,WA了很多次 

20                 if(j>=c[i])

21                     f[i][j]=max(f[i-1][j-c[i]]+v[i],f[i-1][j]);

22             }

23         printf("%d\n",f[n][C]);

24     }

25     return 0;

26 }

滚动数组解法:

#include<stdio.h>

int main()

{

    int i,j,n,v,c,w;

    while(scanf("%d%d",&n,&v)&&n||v)

    {

        int price[1001]={};

        for(i=0;i<n;i++)

        {        

            scanf("%d%d",&c,&w);

            for(j=v;j>=c;j--)  //滚动数组j必须从大到小递推 ,

            //之所以这样是因为本次的 price[j] 需要从前一次的 price[j]得到 

                if(price[j]<price[j-c]+w)

                    price[j]=price[j-c]+w;

        }

        printf("%d\n",price[v]);

    }

    return 0;

}

 

你可能感兴趣的:(苹果)