ACM,动态规划,数字游戏

来源:互联网 发布:攻是什么感觉知乎 编辑:程序博客网 时间:2024/05/22 16:03
// ACM学习-动态规划-数字游戏.cpp : 定义控制台应用程序的入口点。
//


#include "stdafx.h"
#include<iostream>
using namespace std;


struct Tnum{
int a, b;
};
Tnum num[210];//权值
int sum[210][210];//记录目标值,即题目分析中的函数f
int mark[210][210];//记录是否是可行解,0表示不是可行解,1表示是可行解
int n, m;
//输入数据
void init(){
int i;
cin >> n >> m;
//输入a序列
for (i = 1; i <=n; i++)
cin >> num[i].a;
for (i = 1; i <= n; i++)
cin >> num[i].b;
}
int cmp(const void*a, const void *b){
Tnum*aa = (Tnum*)a;
Tnum*bb = (Tnum*)b;
return bb->b - aa->b;
}
void work(){
//for (int i = 0; i < 10; i++)cout << sum[i][i + 1] << endl;
int i, j, k, t, ans;
//对权值从大到小排序
qsort(num+1, n, sizeof(num[1]), cmp);
for (int i = 1; i <=n; i++)cout << num[i].a <<" :"<<num[i].b<< ends;
cout << endl;
memset(mark, 0, sizeof(mark));
for (i = 0; i <=n; i++){
mark[i][0] = 1;
sum[i][0] = 0;
for (j = 0; j < i&&j < m; j++){
mark[i][j + 1] = mark[i - 1][j + 1];
sum[i][j + 1] = sum[i - 1][j + 1];
cout << "sum[" << i << "][" << j + 1 << "]=" << sum[i][j + 1] << endl;
if (mark[i][j] && (mark[i][j + 1] == 0 || sum[i-1][j]
+ num[i].a - num[i].b*j>sum[i][j+1])){
mark[i][j + 1] = 1;
sum[i][j + 1] = sum[i-1][j] + num[i].a - num[i].b*j;
cout << "改变sum[" << i << "][" << j + 1 << "]=" << sum[i][j + 1] << endl;
}

}


}
ans = sum[n][m];
cout << ans << endl;


}
int _tmain(int argc, _TCHAR* argv[])
{
init();
work();






return 0;
}

0 0
原创粉丝点击