您的位置:首页 > 其它

vijos1071【动态规划】

2012-11-03 15:07 204 查看
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define forn(i,n) for(int i=0;i<(n);i++)
#define for1(i,n) for(int i=1;i<=(n);i++)
int n , m;
int f[100010] , c[101];
bool vis[101];
void ZeroOnePack(int cost) {
for(int i=m;i>=cost;i--)
if(f[i-cost]) f[i] += f[i-cost];
}
void read() {
scanf("%d%d",&m,&n);
for1(i,n) scanf("%d",&c[i]);
}
void dp() {
f[0] = 1;
int mm = m;
for1(i,n) ZeroOnePack(c[i]);
if(!f[m]) { puts("0"); return; }
if(f[m] > 1) { puts("-1"); return; }
int flag = 0;
for1(i,n) {
if(m>=c[i] && f[m - c[i]]) {
m -= c[i];
vis[i] = 1;
if(m == 0) break;
}
}
for1(i,n) {
if(!vis[i]) {
if(flag) printf(" ");
else flag = 1;
printf("%d",i);
}
}
printf("\n");
}
int main() {
read();
dp();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: