洛谷P2370 yyy2015c01的U盘
题解:分析一下这道题,发现价值并不是最重要的(因为只要过p就可以嘛),重要的是,最小的接口。
所以应用贪心策略,我们应该优先装接口(大小)小的,然后每次装完判断一下,当前价值是否超过
了p,如果超过了p,这就是最小的最大接口,如果所有的物品都装过,仍没有到达p,就无解。
方法:贪心+01背包
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<algorithm> 5 6 using namespace std; 7 8 int dp[1005],n,p,s; 9 struct node 10 { 11 int w,c; 12 }; 13 node data[1005]; 14 15 inline bool cmp(node x,node y) 16 { 17 return x.w<y.w; 18 } 19 20 int main() 21 { 22 scanf("%d%d%d",&n,&p,&s); 23 for(int i=1;i<=n;i++) 24 scanf("%d%d",&data[i].w,&data[i].c); 25 sort(data+1,data+n+1,cmp); 26 for(int i=1;i<=n;i++) 27 for(int v=s;v>=data[i].w;v--) 28 { 29 dp[v]=max(dp[v],dp[v-data[i].w]+data[i].c); 30 if(dp[v]>=p) 31 { 32 printf("%d",data[i].w); 33 return 0; 34 } 35 } 36 printf("No Solution!"); 37 return 0; 38 }