题目很简单就是完全背包问题,不过需要记录过程中的数量以及对应的价值总和,以最后的价值总和最大为标准,然后求解。程序如下:
#include<stdio.h>
#include<string.h>
#define max(a , b) a > b ? a : b
#define MAXN 10010
int dp[MAXN] ;
int value[MAXN] ;
int num[3] ;
int t ;
int main(int argc , char * argv[]){
while(scanf("%d %d %d" , &num[1] , &num[2] , &t)!=EOF){
memset(dp , 0 , sizeof(dp)) ;
memset(value , 0 , sizeof(value)) ;
int i ;
int j ;
for(i = 1 ; i <= 2 ; i ++){
for(j = 0 ; j <= t ; j ++){
if(j >= num[i]){
if(value[j] < value[j - num[i]] + num[i]){
dp[j] = dp[j-num[i]] + 1 ;
value[j] = value[j - num[i]] + num[i] ;
}
else if(value[j] == value[j-num[i]] + num[i]){
dp[j] = max(dp[j] , dp[j-num[i]] + 1) ;
}
//value[j] = max(value[j] , value[j - num[i]] + num[i]) ;
}
}
}
printf("%d" , dp[t]) ;
if(t - value[t]){
printf(" %d" , t - value[t]) ;
}
printf("\n") ;
}
return 0 ;
}