HDU 1587 Flowers 解题报告

问题描述:

      Gardon去花店买花,花店里有n中花,每种花可以认为有足够多。Gardon有m元钱,一直第i种花的价格为c[i]元。那么,Gardon最多可以买多少朵花?

问题分析:

       这是一个典型的完全背包问题。借鉴01背包的动态规划思想,定义f[i][j]:花费j元钱购买前i种花能买得的最大朵数,得出状态转移方程:f[i][j]=max{f[i-1][j-k*c[i]]+k*w[i]},其中0<=k*c[i]<=v。优化存储空间后,采用一维巧妙的进行解决:

伪码:

      procedure CompletePack(cost,weight)
              for  v=cost..V   //这个for循环的起始恰好和01背包相反,这也恰是存储优化的精要!
                   f[v]=max{f[v],f[v-c[i]]+w[i]}

       结合本题,则状态转移方程为:f[i]=max{f[i],f[i-cost[i]]+1};

#include<iostream> #include<cstdio> #define Max 100001 using namespace std; int f[Max],bag,c[1001]; void MultiplePack(int cost,int weight) { for(int i=cost;i<=bag;i++) if(f[i]<f[i-cost]+weight) f[i]=f[i-cost]+weight; } int main() { int n; while(scanf("%d%d",&n,&bag)!=-1) { for(int i=1;i<=n;i++) scanf("%d",&c[i]); memset(f,0,sizeof(f)); for(int i=1;i<=n;i++) MultiplePack(c[i],1); printf("%d/n",f[bag]); } return 0; }

你可能感兴趣的:(c,优化,存储)