标签:bin item else 图片 lse for 技术 src 分享

#include<stdio.h>
#include<string.h>
#define MaxN 10000
#define MaxC 10000
int Val[MaxN][MaxN];
double binaryKnapsack(int numItems, int *w,int *v, int capacity)
{
int i, j;
for(i = 1; i <= numItems; ++i) {
for(j = 1; j <= capacity; j++) {
if(j < w[i-1]) {
Val[i][j] = Val[i-1][j];
continue;
}
if( (Val[i-1][j-w[i-1]] + v[i-1]) >Val[i-1][j]) {
Val[i][j] = (Val[i-1][j-w[i-1]] + v[i-1]);
} else {
Val[i][j] = Val[i-1][j];
}
}
}
/**
for (i = 0; i < numItems; ++i)
for (j = capacity; j >= 0; j--)
if (j >= w[i] && Val[j] < Val[j - w[i]] + v[i])
Val[j] = Val[j - w[i]] + v[i];
return Val[capacity]; **/
return Val[numItems][capacity];
}
int main()
{
int i, n, C, w[MaxN];
int v[MaxN];
int flag[MaxN];
int ans;
while (scanf("%d%d", &C, &n) != EOF)
{
for (i = 0; i < n; ++i)
scanf("%d", &w[i]);
for (i = 0; i < n; ++i)
scanf("%d", &v[i]);
ans = binaryKnapsack(n, w, v, C);
printf("%d", ans);
int j = C;
memset(flag, 0, sizeof(flag));
for(int i = n; i > 0; i-- ) {
if(Val[i][j] > Val[i-1][j]) {
flag[i] = 1;
j = j - w[i-1];
if(j < 0) break;
}
}
for(int i = 1; i <= n; i++) {
printf(" %d",flag[i]);
}
printf("\n");
}
return 0;
}
标签:bin item else 图片 lse for 技术 src 分享
原文地址:https://www.cnblogs.com/jj81/p/9926442.html