hdu3466



題意:輸入 N,M                         N:多少個測試用例   M:你手上擁有的錢


                   Pi,Qi,Vi                 Pi:  這件物品的價格   Qi:你手上錢M必須大於等於Qi才能買    


                                                     Vi:這件物品的價值


           輸出 :你能買到的東西的最大價值是多少?


 


 


 


 


這道題由於規定了手上的前低於q時就不能購買該樣東西,所以要先將商品按q-p排序,剩下的就是簡單的01揹包了。


有什麼不懂可以看看我以前寫的01揹包問題。

#include<iostream>
#include <cstdio>
#include <algorithm>
using namespace std;


struct calu
{
 int Pi, Qi,Vi;
}a[555];


int max(int a,int b)
{
 if(a>b)return a;
 else return b;
}


bool cmp(calu x,calu y)
{
 return x.Qi-x.Pi<y.Qi-y.Pi;
}


int main()
{
 int N,M,i,j,f[5555];
 while(scanf("%d",&N)!=EOF)
 {
  cin>>M;
  memset(f,0,sizeof(f));
  for(i=0;i<N;i++)
  {
   cin>>a[i].Pi>>a[i].Qi>>a[i].Vi;
  }
  sort(a,a+N,cmp);
   for(i=0;i<N;i++)
        {
            for(j=M;j>=a[i].Qi;j--)
            {
               f[j]=max(f[j],f[j-a[i].Pi]+a[i].Vi);
            }
   }
   cout<<f[M]<<endl;
 }
 return 0;
}


   
 附上一組測試用例


4 20
5 15 20
8 12 19
2 16 21
9 11 13


 


答案:60











 


 


 
發佈了40 篇原創文章 · 獲贊 18 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章