1 条题解
-
0
使用动态规划来解决这个问题。
#include <cstdio> #include <cstring> #include <cstdlib> const int N = 105; const int M = 10005; const int INF = 0x3f3f3f3f; int n, a[N]; double p[N]; int dp[M], path[M]; void print(int u) { if (u - a[path[u]] == 0) { printf("%d", path[u]); return; } print(u - a[path[u]]); printf(" %d", path[u]); } int main() { while (~scanf("%d", &n) && n) { double sum = 0; for (int i = 1; i <= n; i++) { scanf("%lf", &p[i]); sum += p[i]; } memset(dp, 0, sizeof(dp)); dp[0] = 1; for (int i = 1; i <= n; i++) { a[i] = p[i] / sum * 10000; for (int j = 10000; j >= a[i]; j--) { if (dp[j - a[i]] && !dp[j]) { dp[j] = dp[j - a[i]]; path[j] = i; } } } int v = 0; for (int i = 10000; i; i--) { if (dp[i] && abs(10000 - 2 * v) > abs(10000 - 2 * i)) v = i; } print(v); printf("\n"); } return 0; }
- 1
信息
- ID
- 854
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者