可能重复:
How to have C++ solve the equation for an input value?
我是C ++的新手,我只是在玩......
#include <iostream>
using namespace std;
int limbs(int handdmg, int armdmg, int chestdmg, int headshot, int legdmg)
{
return handdmg + armdmg + chestdmg + legdmg + headshot;
}
main ()
{
int totaldmg;
int handdmg;
int armdmg;
int chestdmg;
int legdmg;
int headshot;
int Dmgdial;
int x;
// limiting the variables to a smaller range of integers
handdmg = 0 < x < 5;
armdmg = 10 < x < 15;
chestdmg = 25 < x < 50;
legdmg = 30 < x < 40;
headshot = 80 < x < 120;
cout << "Enter your total damage taken:" << endl;
cin >> totaldmg;
Dmgdial = totaldmg;
// want the variables to = the input value in the best smallest way possible
limbs(handdmg, armdmg, chestdmg, headshot, legdmg) = Dmgdial;
// then print the variables answers to the screen
cout << "damage given to the hand: " << handdmg << endl;
cout << "damage given to the arm: " << armdmg << endl;
cout << "damage given to the chest: " << chestdmg << endl;
cout << "damage given to the leg: " << legdmg << endl;
cout << "damage given to the head: " << headshot << endl;
cin.clear();
cin.ignore(2505, '\n');
cin.get();
return 0;
}
所以概念很简单 - 你在程序中输入156这样的值然后让计算机计算使用x的有限值来获得该值的最佳方法。
但是,limbs(handdmg, armdmg, chestdmg, headshot, legdmg) = Dmgdial
不起作用。就编译器而言,它是倒退的。
我如何让这种类型的程序工作?
答案 0 :(得分:2)
[..]获得该值的最佳途径[...]
这是你的任务。 “电脑”对损坏或爆头是什么都不了解。拿一张纸写下来,你要怎样从总损伤值计算损伤细节。例如:
struct DamageDetails
{
int head, leg, arm;
const int HEAD_MAX = 120;
const int HEAD_MIN = 80;
static DamageDetails FromTotalDamage(int totalDamage)
{
DamageDetails damage;
int damageTakenSoFar = totalDamage;
damage.head = totalDamage / 2; // 50% damage is taken to head
if (damage.head > HEAD_MAX)
damage.head = HEAD_MAX;
damageTakenSoFar -= damage.head;
// ...
return damage;
}
};
答案 1 :(得分:0)
你试图用5个未知数求解1个方程,这是一个未确定的问题。你需要一个包含5个未知数的5个方程组来得到一个独特的答案。
此外,你还没有实际指定方程式 - 现在看起来你只是假设一个线性方程t = x + y + z + v + w。考虑到你所拥有的限制变量的(奇怪的)部分,这可能是不正确的。
此外,C ++不是求解方程的数学系统。您需要编写代码以自行解决,或使用第三方库。
总的来说,我会说你是在掌控自己,就数学和编程专业知识来做你想做的事情。在尝试这样的任务之前,您将从学习更多理论中受益。
答案 2 :(得分:0)
以下是使用回溯的问题解决方案:
#include <stdio.h>
int v[100], n, int dmg;
void init(int k)
{
v[k] = 0;
}
bool solutionReached( int k )
{
if (k <= 5)
return false;
int sum = 0;
for (int i = 1; i <= k; i++)
{
sum += v[i];
}
if(sum == dmg)
{
if( v[1] < 5 &&
v[2] > 10 && v[2] < 15 &&
v[3] > 25 && v[3] < 50 &&
v[4] > 30 && v[4] < 40 &&
v[5] > 80 && v[5] < 120)
return true;
}
return false;
}
void printSolution( int k )
{
for (int i = 1; i < k; i++)
{
printf("%i ", v[i]);
}
printf("\n");
}
bool hasSuccesor( int k )
{
if(v[k] < 120 && k <= 5)
{
v[k]++;
return true;
}
return false;
}
bool isValid( int k )
{
/*
if(v[1] > 5)
return false;
if(!(v[2] > 10 && v[2] < 15))
return false;
if(!(v[3] > 25 && v[3] < 50))
return false;
if(!(v[4] > 30 && v[4] < 40))
return false;
if (!(v[5] > 80 && v[5] < 120))
return false;
*/
return true;
}
void bkt(int k)
{
if(solutionReached(k))
printSolution(k);
else
{
init(k);
while(hasSuccesor(k))
if(isValid(k))
bkt(k + 1);
}
}
int main(int argc, char* argv[])
{
dmg = 200;
n = 6;
bkt(1);
return 0;
}