题目:http://acm.hdu.edu.cn/showproblem.php?pid=2111
题目理解:给出一个口袋的容量,若干种宝物的单价和体积,单个的宝物可以分割,待求的是最多能装价值多少的宝物.
思路:宝物可以分割,所以如果宝物足够多的话,口袋可以装满.因此,先对所有宝物按照价格递减排序,然后从高价的宝物开始,把它们放进口袋,直到宝物装完了或者口袋装满了为止.
装的过程中会遇到两种情况:
1.某种宝物的体积小于口袋的体积,则将这种宝物全部装进口袋,更新口袋的剩余容积.
2.某种宝物的体积大于口袋的体积,则将这种宝物的一部分装进口袋是口袋装满.
C++代码如下
#include<iostream> #include<algorithm> using namespace std; struct Treasure//将宝物看多 结构体 { int price; int volume; }; bool cmp(Treasure t1,Treasure t2) { return t1.price > t2.price;//用于将宝物按照价格递减顺序排序 } int main() { int V,n; while(cin>>V) { if(V==0) break; cin >> n; Treasure *T = new Treasure[n]; for(int i=0;i<n;i++) cin >> T[i].price >> T[i].volume; sort(T,T+n,cmp);//排序 int result = 0; for(int i=0;i<n;i++) { if(V==0) break;//口袋满了,退出 if(V>T[i].volume) { result += T[i].price * T[i].volume; V = V - T[i].volume;//更新口袋数据 } else { result += T[i].price * V; V = 0;//更新口袋数据 } } cout << result << endl; } return 0; }注意:上述代码提交会出现错误提示,删掉所有的注释再提交,可以通过.