动态规划——切钢筋问题
#include <stdio.h>
#include <stdlib.h>
#define UNKNOWN -1
#define LEN 10
int rodcut(int len);
int rodcut_TD(int len);
int rodcut_BU(int len);
void printSolution(int len);
int prices[LEN + 1];
int knownPrices[LEN + 1];
int knownLen[LEN + 1];
int revenue[LEN + 1];
int main(void){
int i;
for(i = 0;i <= LEN;i++)
knownPrices[i] = UNKNOWN;
prices[0] = 0;
printf("Please input prices of %d length\n", LEN);
for(i = 1;i <= LEN;i++)
scanf("%d", prices + i);
for(i = 1;i <= LEN;i++){
//printf("rodcut(%d) = %d\n", i, rodcut(i));
//printf("rodcut_TD(%d) = %d\n", i, rodcut_TD(i));
printf("rodcut_BU(%d) = %d\n", i, rodcut_BU(i));
printf("Possible Solution : ");
printSolution(i);
printf("\n");
}
return 0;
}
int rodcut(int len){
/* direct recursive solution */
int t, i, max;
if(len == 0) return 0;
for(i = 1, max = 0;i <= len;i++){
if( (t = prices[i] + rodcut(len - i)) > max )
max = t;
}
return max;
}
int rodcut_TD(int len){
/* top-down dynamic programming*/
int i, t, max, maxi;
if(knownPrices[len] != UNKNOWN) return knownPrices[len];
if(0 == len) return knownPrices[len] = 0;
for(i = 1, max = 0;i <= len;i++){
if( (t = prices[i] + rodcut_TD(len - i)) > max ){
max = t;
maxi = i;
}
}
knownLen[len] = maxi;
return knownPrices[len] = max;
}
int rodcut_BU(int len){
/* bottom-up dynamic programming */
int i, n, t, max, max