zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    web前端之jQuery
    java之awt编程
    java连接数据库的基本操作
    实习生应聘经历2018/3/1
    javaweb学习之建立简单网站
    mysql之视图
    71. Simplify Path
    347. Top K Frequent Elements
    7. Reverse Integer
    26. Remove Duplicates from Sorted Array
  • 原文地址:https://www.cnblogs.com/shihuajie/p/3045764.html
Copyright © 2011-2022 走看看