首页 > 代码库 > ACM1881 01背包问题应用

ACM1881 01背包问题应用

01背包问题动态规划应用

acm1881毕业bg

将必须离开的时间限制看作背包容量,先将他们由小到大排序,然后在排完序的数组中对每个实例都从它的时间限制开始(背包容量)到它的延长时间进行遍历;

 1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 using namespace std; 5 struct BG 6 { 7     int h,t,l; 8     friend bool operator<(BG a,BG b)     9     {10         return a.l<b.l;11     }12 };13 BG *bg;14 int main()15 {16     int n,m;17     int value[3500];18     while(cin>>n&&n>=0)19     {20         m=0;21         if(n==0)22         {23             cout<<0<<endl;24             continue;25         }26         bg=new BG[n];27         memset(value,0,sizeof(value));28         for(int i=0;i<n;i++)29         {30             cin>>bg[i].h>>bg[i].t>>bg[i].l;31             m=(bg[i].l>m)?bg[i].l:m;32         }33         sort(bg,bg+n);34         for(int i=0;i<n;i++)35         {36             for(int j=bg[i].l;j>=bg[i].t;j--)37             {38                 value[j]=max(value[j],value[j-bg[i].t]+bg[i].h);39             }40         }41         int ans=0;42         for(int i=0;i<=m;i++)43         {44             if(value[i]>ans)ans=value[i];45         }46         cout<<ans<<endl;47     }48     return 0;49 }