標籤:os io for 問題 演算法 type ios dp
包可以承受15kg重量,有五個物體品質依次為12, 2 ,1, 4, 1價格為4,2,2,10,1,求包所能裝的最大價值是
問題分析:
1.先求出價值=格/重量,並用數組儲存;
2.根據價值,對數組內元素進行從大到小排序
3.從價值高的開始裝,此時,背包問題分為可切割背包問題和不可切割背包問題
- //可切割背包問題
- #include <iostream>
- using namespace std;
- class a
- {
- public:
- int p,w;
- double v;
- };
- int main()
- {
- a f[5],t;
- int i,j,s,m,n,sum;
- cin>>n;
- for(i=0;i<5;i++)
- {
- cin>>f[i].p>>f[i].w;
- f[i].v=(double)f[i].p/(double)f[i].w;
- }
- for(i=0;i<5;i++)
- for(j=0;j<5;j++)
- {
- if(f[i].v>f[j].v)
- {
- t=f[i];
- f[i]=f[j];
- f[j]=t;
- }
- }
- s=0;
- m=0;
- sum=0;
- for(i=0;i<5;i++)
- {
- s=s+f[i].w;
- if(n>s)
- {
- m=n-s;
- sum=sum+f[i].p;
- }
- else
- sum=sum+f[i].v*m;
-
- }
- cout<<sum<<endl;
- return 0;
- }
- 不可分割背包問題
- #include <iostream>
- using namespace std;
- class a
- {
- public:
- int p,w;
- double v;
- };
- int main()
- {
- a f[5],t;
- int i,j,s,m,n;
- cin>>n;
- for(i=0;i<5;i++)
- {
- cin>>f[i].p>>f[i].w;
- f[i].v=(double)f[i].p/(double)f[i].w;
- }
- for(i=0;i<5;i++)
- for(j=0;j<5;j++)
- {
- if(f[i].v>f[j].v)
- {
- t=f[i];
- f[i]=f[j];
- f[j]=t;
- }
- }
- s=0;
- m=0;
-
- for(i=0;i<5;i++)
- {
- s=s+f[i].w;
- if(s>n)break;
- m=m+f[i].p;
- }
- cout<<m<<endl;
- return 0;
- }