vijos P1071新年趣事之打牌
2015-09-12 14:48
323 查看
01背包,网上看了好些记录方法都不太喜,自己就写了个
#include <stdio.h> #include <string.h> int dp[100005], a[105], vis[100005], put[105]; int main() { int n, i, j, v, sum, flag, tp, ok; scanf("%d %d", &v, &n); sum = 0; for(i = 0;i < n;i++){ scanf("%d", &a[i]); sum += a[i]; } v = sum - v; flag = 0; memset(vis, -1, sizeof(vis)); for(i = 0;i < n;i++) for(j = v;j >= a[i];j--) { if(dp[j - a[i]] + a[i] > dp[j]){ dp[j] = dp[j - a[i]] + a[i]; vis[j] = i; } else if(dp[j - a[i]] + a[i] == dp[j]&&dp[j] == j&&j == v) flag = 1; } if(dp[v] != v) printf("0\n"); else if(flag) printf("-1\n"); else{ tp = v; ok = 0; while(vis[tp] != -1){ put[ok++] = vis[tp] + 1; tp = tp - a[vis[tp]]; } for(i = ok - 1;i >= 0;i--) printf("%d%c", put[i], i==0?'\n':' '); } return 0; }
相关文章推荐