这道题感觉怪怪的,虽然知道是dp,但是这个逻辑我好想不怎么理解,先把代码粘上来,以后再慢慢理解。
#include <stdio.h>
#include <vector>
using namespace std;
vector<int> v;
unsigned char dp[1000001];
void func(int bag_size){
int i, k, count;
dp[0] = 0; //没有石头,第一个人不可能赢
for(i=1; i<=bag_size; i++){
dp[i] = 0; //首先假设第一个人不可能赢
for(k=0; k<v.size(); k++){
if(i-v[k] >= 0){
if(dp[i-v[k]]==0){
dp[i] = 1;
break;
}
}
}
}
if(dp[bag_size]){
printf("Stan wins\n");
}
else{
printf("Ollie wins\n");
}
}
int main(void){
int bag_size;
int n, num;
//freopen("input.dat", "r", stdin);
while(scanf("%d", &bag_size) != EOF){
scanf("%d", &n);
v.clear();
while(n--){
scanf("%d", &num);
v.push_back(num);
}
func(bag_size);
}
return 0;
}