重みつき集合被服問題のグリーディー法による近似アルゴリズムを実装しなさいという問題です。
入力:探査対象の集合 U={e1,e2,…e9}
探査軌道の集合 S={S1,S2,…S8}
コスト関数 c:S→Q^+(正の有理数)
また、それぞれの軌道にある探査対象は、
S1={e3,e4,e5,e6}
S2={e3}
S3={e1,e2}
S4={e5,e7}
S5={e5,e6}
S6={e8}
S7={e1,e2,e3,e8,e9}
S8={e9}
それぞれの軌道のコストc(S)はS1から順にS8まで、{90,34,23,30,20,98,100,2}となります。
そして、出力がカバーC(U(Si∈C))Si=Uとなるもの)で、総コスト∑(Si∈C)c(Si)が最小となるものにしてください。
探査対象1つあたりのコストが最小の軌道から、Cに加えていけば全体を網羅する軌道を求められると考えているのですが、それを具体的にどう表現していいのかがわかりません。
それと、文字列を数値に変換するのはatoi()などを使う、ということくらいはわかるのですがやり方が悪いのかコンパイルエラーになってしまいます。
以下、自分で書いたプログラムです。(ほとんど合ってないと思うのですが)2年は学習しているものの、恥ずかしながら知識が乏しいので詳しく教えていただきたいです。
まず、手のつけ方からわからないのでそこから教えてください。
恐縮ですがよろしくお願いします。
#include<stdio.h>
#include<stdlib.h>
int main(int argc, int argv[]){
int atoi(const char *str);
int inum;
char str[8] = {90,34, 23, 30, 20, 98, 100, 2};
int i, x, min;
char a[8][9] = {
{0, 0, 1, 1, 1, 1, 0, 0, 0},
{0, 0, 1, 0, 0, 0, 0, 0, 0},
{1, 1, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 1, 0, 1, 0, 0},
{0, 0, 0, 0, 1, 1, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 1, 0},
{1, 1, 0, 0, 0, 0, 0, 1, 1},
{0, 0, 0, 0, 0, 0, 0, 0, 1}
};
int j;
inum = atoi(str[0]);
printf("%d\n", inum);
for(j=0, min = x; j < 8; j++) {
if( min > x ) {
min = x;
}
}
return 0;
}