简单的动态规划
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <string.h>
using namespace std;
int obj_size[21];
struct dp_node{
int obj_num;
int sum;
int path[21];
};
void func(int bag_size, int n){
int i, j, temp;
struct dp_node *dp;
dp = (struct dp_node*)malloc(sizeof(struct dp_node)*(bag_size+1));
for(i=0; i<=bag_size; i++) {
dp[i].sum = 0;
dp[i].obj_num = 0;
}
for(i=1; i<=n; i++){
for(j=bag_size; j>=1; j--){
if(j>=obj_size[i]){
temp = dp[j-obj_size[i]].sum + obj_size[i];
if(temp<=bag_size && temp>dp[j].sum){
dp[j].sum = temp;
memcpy(dp[j].path, dp[j-obj_size[i]].path, sizeof(int)*dp[j-obj_size[i]].obj_num);
dp[j].path[dp[j-obj_size[i]].obj_num] = i;
dp[j].obj_num = dp[j-obj_size[i]].obj_num+1;
}
}
}
}
for(i=0; i<dp[bag_size].obj_num; i++){
printf("%d ", obj_size[dp[bag_size].path[i]]);
}
printf("sum:%d\n", dp[bag_size].sum);
free(dp);
return;
}
int main(void){
int bag_size, n, i;
//freopen("input.dat", "r", stdin);
while(scanf("%d", &bag_size) != EOF){
scanf("%d", &n);
for(i=1; i<=n; i++)
scanf("%d", obj_size+i);
func(bag_size, n);
}
return 0;
}