度度熊的午饭时光 2017百度之星

题目链接:点击打开链接

思路是dp加记录路径,也就交了20发才过。

比赛结束上源码。

#include 
using namespace std;
typedef long long ll;
#define INF 0x3f3f3f3f

typedef struct 
{
	int ret;
	int value;
	int pos[1010];
	int cnt;
	int st_sum;
} node;

node f[1010];

int main(int argc, char const *argv[]){
	int T;
	cin >> T;
	int _case = 1;
	while ( T-- ){
		int V;
		int n;
		cin>>V;
		cin>>n;
		int score[1010];
		int weight[1010];
		for (int i = 1; i <= n; ++i){
			cin >> score[i] >> weight[i];
		}
		printf("Case #%d:\n", _case);
		_case++;
		memset(f, 0, sizeof(f));
		f[0].ret = 1;
		for (int i = 1; i <= n; ++i){
			for (int j = V; j >= weight[i]; --j){
				if ( f[j - weight[i]].ret == 1 ){
					if ( f[j].value > f[j-weight[i]].value + score[i]){
						continue;
					}
					else if ( f[j].value == f[j-weight[i]].value + score[i]){
						if ( f[j].st_sum > f[j-weight[i]].st_sum + i ){
							f[j] = f[j-weight[i]];
							f[j].value = f[j-weight[i]].value + score[i];
							f[j].pos[f[j].cnt] = i;
							f[j].cnt++;
							f[j].st_sum += i;
							sort(f[j].pos, f[j].pos + f[j].cnt);
						}
						else if ( f[j].st_sum == f[j-weight[i]].st_sum + i){
							string a;
							string b;
							for(int k = 0; k < f[j].cnt; k++ ){
								a += (f[j].pos[k] + '0');
							}
							for(int k = 0; k < f[j-weight[i]].cnt; k++ ){
								b += (f[j-weight[i]].pos[k] + '0');
							}
							if( a.compare(b) == 1 ){
								f[j] = f[j-weight[i]];
								f[j].value = f[j-weight[i]].value + score[i];
								f[j].pos[f[j].cnt] = i;
								f[j].cnt++;
								f[j].st_sum += i;
								sort(f[j].pos, f[j].pos + f[j].cnt);
							}
						}
					}
					else{
						f[j] = f[j-weight[i]];
						f[j].value = f[j-weight[i]].value + score[i];
						f[j].pos[f[j].cnt] = i;
						f[j].cnt++;
						f[j].st_sum += i;
						sort(f[j].pos, f[j].pos + f[j].cnt);
					}
				}
			}
		}
		int ans = 0;
		int mmax = 0;
		for (int i = V; i >= 0 ; --i){
			if ( f[i].value > mmax ){
				ans = i;
				mmax = f[i].value;
			}
			else{
				if( f[i].value == mmax ){
					if ( f[i].st_sum < f[ans].st_sum ){
						ans = i;
					}
					else if ( f[i].st_sum == f[ans].st_sum ){
						string a;
						string b;
						for(int k = 0; k < f[i].cnt; k++ ){
							a += (f[i].pos[k] + '0');
						}
						for(int k = 0; k < f[ans].cnt; k++ ){
							b += (f[ans].pos[k] + '0');
						}
						if( a.compare(b) == -1 ){
							ans = i;
						}
					}
				}
			}
		}
		cout<


你可能感兴趣的:(百度之星)