标签:des os 数据 io for 问题 div amp
5 10 1 2 3 4 5
number:1 weight:1 number:4 weight:4 number:5 weight:5
/* 把所有的重量从小到大排序。每次都是从最大的数开始加 再看前面的数有没有< = 背包重量-已加的重量 有的话再加上 */ #include<iostream> #include<cstdio> #include<algorithm> using namespace std; struct st { int num; //重量 int xu; //序号 } w[15], b[15]; bool cmp(st a, st b ) { if(a.num != b.num) return a.num < b.num; else return a.xu < b.xu; } int main() { int n, s, i, k, j, sum = 0, x, flag = 0, t, m; while(cin >> n >> s) { sum = 0; flag = 0; for(i = 1; i <= n; i++) //赋初值 { cin >> w[i].num; w[i].xu = i; } sort(w + 1, w + n + 1, cmp); // 排序 重量从小到大 for(i = n; i >= 1; i--) // 处理数据,把符合要求的数放在b中 { k = 0; sum = w[i].num; b[k].num = w[i].num; b[k].xu = w[i].xu; x = s - sum; // 差 k++; for(j = i - 1; j > 0; j--) { if(w[j].num <= x) // 当前数是否小于差 { sum += w[j].num; // sum加上当前数 b[k].num = w[j].num; b[k].xu = w[j].xu; x = s - sum; // 差=背包重量-已加的重量 k++; } } // 当有个重量为零时,可加/可不加 if(sum == s&&flag == 0) // flag标记只输出一组 { for(j = 0; j < k - 1; j++) //排序 输出时序号小的在前面 for(t = j + 1; t < k; t++) { if(b[j].xu > b[t].xu) { m = b[j].xu; b[j].xu = b[t].xu; b[t].xu = m; m = b[j].num; b[j].num = b[t].num; b[t].num = m; } } for(j = 0; j < k; j++) printf("number:%d weight:%d\n", b[j].xu, b[j].num); flag=1; } if(i==1&&flag==0) //当只剩下一个数时 && 没有找到 cout << "not found"<< endl; } } return 0; }
标签:des os 数据 io for 问题 div amp
原文地址:http://blog.csdn.net/ruruoran/article/details/38227421